Support legacy fields
diff --git a/parser/parser.go b/parser/parser.go
index 6c3c750..0dc2b03 100644
--- a/parser/parser.go
+++ b/parser/parser.go
@@ -24,7 +24,7 @@
Layer string `json:"layer,omitempty"`
Match string `json:"match,omitempty"`
Value string `json:"value,omitempty"`
- Rewrites []ast.Rewrite `json:"rewrites,omitempty"`
+ Rewrites []ast.Rewrite `json:"-"` // Handle manually
// Store any additional fields
Extra map[string]any `json:"-"`
}
@@ -37,13 +37,52 @@
return err
}
- // Create a temporary struct to unmarshal known fields
- type tempNode rawNode
+ // Create a temporary struct without the problematic fields
+ type tempNode struct {
+ Type string `json:"@type"`
+ Wrap json.RawMessage `json:"wrap,omitempty"`
+ Operands []rawNode `json:"operands,omitempty"`
+ Relation string `json:"relation,omitempty"`
+ Foundry string `json:"foundry,omitempty"`
+ Key string `json:"key,omitempty"`
+ Layer string `json:"layer,omitempty"`
+ Match string `json:"match,omitempty"`
+ Value string `json:"value,omitempty"`
+ }
+
var temp tempNode
if err := json.Unmarshal(data, &temp); err != nil {
return err
}
- *r = rawNode(temp)
+
+ // Copy the fields
+ r.Type = temp.Type
+ r.Wrap = temp.Wrap
+ r.Operands = temp.Operands
+ r.Relation = temp.Relation
+ r.Foundry = temp.Foundry
+ r.Key = temp.Key
+ r.Layer = temp.Layer
+ r.Match = temp.Match
+ r.Value = temp.Value
+
+ // Handle rewrites manually
+ if rewritesData, exists := raw["rewrites"]; exists && rewritesData != nil {
+ if rewritesList, ok := rewritesData.([]any); ok {
+ r.Rewrites = make([]ast.Rewrite, len(rewritesList))
+ for i, rewriteData := range rewritesList {
+ rewriteBytes, err := json.Marshal(rewriteData)
+ if err != nil {
+ return fmt.Errorf("failed to marshal rewrite %d: %w", i, err)
+ }
+ var rewrite ast.Rewrite
+ if err := json.Unmarshal(rewriteBytes, &rewrite); err != nil {
+ return fmt.Errorf("failed to unmarshal rewrite %d: %w", i, err)
+ }
+ r.Rewrites[i] = rewrite
+ }
+ }
+ }
// Store any fields not in the struct in Extra
r.Extra = make(map[string]any)