mirror of
https://github.com/pocketbase/pocketbase.git
synced 2025-03-19 22:19:23 +02:00
42 lines
842 B
Go
42 lines
842 B
Go
|
package picker
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/pocketbase/pocketbase/tools/tokenizer"
|
||
|
)
|
||
|
|
||
|
var Modifiers = map[string]ModifierFactoryFunc{}
|
||
|
|
||
|
type ModifierFactoryFunc func(args ...string) (Modifier, error)
|
||
|
|
||
|
type Modifier interface {
|
||
|
// Modify executes the modifier and returns a new modified value.
|
||
|
Modify(value any) (any, error)
|
||
|
}
|
||
|
|
||
|
func initModifer(rawModifier string) (Modifier, error) {
|
||
|
t := tokenizer.NewFromString(rawModifier)
|
||
|
t.Separators('(', ')', ',', ' ')
|
||
|
t.IgnoreParenthesis(true)
|
||
|
|
||
|
parts, err := t.ScanAll()
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
if len(parts) == 0 {
|
||
|
return nil, fmt.Errorf("invalid or empty modifier expression %q", rawModifier)
|
||
|
}
|
||
|
|
||
|
name := parts[0]
|
||
|
args := parts[1:]
|
||
|
|
||
|
factory, ok := Modifiers[name]
|
||
|
if !ok {
|
||
|
return nil, fmt.Errorf("missing or invalid modifier %q", name)
|
||
|
}
|
||
|
|
||
|
return factory(args...)
|
||
|
}
|