fix literal.Map to handle list values too

This commit is contained in:
Fabio Bozzo
2024-11-04 17:10:57 +01:00
parent 5bfe430934
commit bc847ee027
2 changed files with 43 additions and 0 deletions

View File

@@ -51,6 +51,24 @@ func Map(m map[string]any) (ipld.Node, error) {
if err != nil {
return nil, err
}
for _, elem := range x {
switch e := elem.(type) {
case string:
if err := la.AssembleValue().AssignString(e); err != nil {
return nil, err
}
case map[string]any:
nestedNode, err := Map(e)
if err != nil {
return nil, err
}
if err := la.AssembleValue().AssignNode(nestedNode); err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("unsupported array element type: %T", elem)
}
}
if err := la.Finish(); err != nil {
return nil, err
}

View File

@@ -798,6 +798,31 @@ func TestPartialMatch(t *testing.T) {
expectedMatch: true,
expectedStmt: nil,
},
{
name: "returns true for partially present nested optional paths",
policy: MustConstruct(
And(
Equal(".required", literal.String("present")),
Any(".items",
And(
Equal(".name", literal.String("test")),
Like(".optional_id?", "ID*"),
),
),
),
),
data: map[string]interface{}{
"required": "present",
"items": []interface{}{
map[string]interface{}{
"name": "test",
// optional_id is missing
},
},
},
expectedMatch: true,
expectedStmt: nil,
},
}
for _, tt := range tests {