2026-04-24 19:18:20 -08:00
|
|
|
package criteria
|
|
|
|
|
|
|
|
|
|
import "fmt"
|
|
|
|
|
|
|
|
|
|
type Visitor func(Expression) error
|
|
|
|
|
|
|
|
|
|
func Walk(expr Expression, visit Visitor) error {
|
|
|
|
|
if expr == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
if err := visit(expr); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
switch e := expr.(type) {
|
|
|
|
|
case All:
|
|
|
|
|
for _, child := range e {
|
|
|
|
|
if err := Walk(child, visit); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
case Any:
|
|
|
|
|
for _, child := range e {
|
|
|
|
|
if err := Walk(child, visit); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-28 15:40:08 -08:00
|
|
|
case Is, IsNot, Gt, Lt, Before, After, Contains, NotContains, StartsWith, EndsWith, InTheRange, InTheLast, NotInTheLast, InPlaylist, NotInPlaylist, IsMissing, IsPresent:
|
2026-04-24 19:18:20 -08:00
|
|
|
return nil
|
|
|
|
|
default:
|
|
|
|
|
return fmt.Errorf("unknown criteria expression type %T", expr)
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Fields(expr Expression) map[string]any {
|
2026-04-26 06:43:54 -08:00
|
|
|
return expr.fields()
|
2026-04-24 19:18:20 -08:00
|
|
|
}
|