2 Commits

Author SHA1 Message Date
Fabio Bozzo
d44bf32fad adapt KindAll too 2024-10-21 16:39:19 +02:00
Fabio Bozzo
948945bdf1 fix(policy): refactor kind-any and equality 2024-10-21 16:33:18 +02:00

View File

@@ -38,20 +38,13 @@ func matchStatement(statement Statement, node ipld.Node) bool {
switch statement.Kind() { switch statement.Kind() {
case KindEqual: case KindEqual:
if s, ok := statement.(equality); ok { if s, ok := statement.(equality); ok {
one, many, err := s.selector.Select(node) one, _, err := s.selector.Select(node)
if err != nil { if err != nil {
return false return false
} }
if one != nil { if one != nil {
return datamodel.DeepEqual(s.value, one) return datamodel.DeepEqual(s.value, one)
} }
if many != nil {
for _, n := range many {
if eq := datamodel.DeepEqual(s.value, n); eq {
return true
}
}
}
return false return false
} }
@@ -128,16 +121,41 @@ func matchStatement(statement Statement, node ipld.Node) bool {
} }
case KindAll: case KindAll:
if s, ok := statement.(quantifier); ok { if s, ok := statement.(quantifier); ok {
_, many, err := s.selector.Select(node) one, many, err := s.selector.Select(node)
if err != nil || many == nil { if err != nil {
return false return false
} }
if one != nil {
it := one.ListIterator()
if it != nil {
for !it.Done() {
_, v, err := it.Next()
if err != nil {
return false
}
ok := matchStatement(s.statement, v)
if !ok {
return false
}
}
} else {
ok := matchStatement(s.statement, one)
if !ok {
return false
}
}
}
if len(many) > 0 {
for _, n := range many { for _, n := range many {
ok := matchStatement(s.statement, n) ok := matchStatement(s.statement, n)
if !ok { if !ok {
return false return false
} }
} }
}
return true return true
} }
case KindAny: case KindAny:
@@ -146,13 +164,29 @@ func matchStatement(statement Statement, node ipld.Node) bool {
if err != nil { if err != nil {
return false return false
} }
if one != nil { if one != nil {
it := one.ListIterator()
if it != nil {
for !it.Done() {
_, v, err := it.Next()
if err != nil {
return false
}
ok := matchStatement(s.statement, v)
if ok {
return true
}
}
} else {
ok := matchStatement(s.statement, one) ok := matchStatement(s.statement, one)
if ok { if ok {
return true return true
} }
} }
if many != nil { }
if len(many) > 0 {
for _, n := range many { for _, n := range many {
ok := matchStatement(s.statement, n) ok := matchStatement(s.statement, n)
if ok { if ok {