Skip to content

Commit

Permalink
Add sets and lists extensions to REPL (#1005)
Browse files Browse the repository at this point in the history
  • Loading branch information
l46kok authored Aug 22, 2024
1 parent 2e58e6e commit 6df4157
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 21 deletions.
49 changes: 29 additions & 20 deletions repl/evaluator.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"errors"
"fmt"
"os"
"sort"
"strings"

"github.com/google/cel-go/cel"
Expand All @@ -41,6 +42,19 @@ import (
descpb "google.golang.org/protobuf/types/descriptorpb"
)

var (
extensionMap = map[string]cel.EnvOption{
"optional": cel.OptionalTypes(),
"bindings": ext.Bindings(),
"strings": ext.Strings(),
"protos": ext.Protos(),
"math": ext.Math(),
"encoders": ext.Encoders(),
"sets": ext.Sets(),
"lists": ext.Lists(),
}
)

// letVariable let variable representation
type letVariable struct {
identifier string
Expand Down Expand Up @@ -723,26 +737,22 @@ func (o extensionOption) Option() cel.EnvOption {
}

func newExtensionOption(extType string) (*extensionOption, error) {
var extOption cel.EnvOption
extType = strings.ToLower(extType)
switch op := extType; op {
case "bindings":
extOption = ext.Bindings()
case "optional":
extOption = cel.OptionalTypes()
case "strings":
extOption = ext.Strings()
case "protos":
extOption = ext.Protos()
case "math":
extOption = ext.Math()
case "encoders":
extOption = ext.Encoders()
default:
return nil, fmt.Errorf("Unknown option: %s. Available options are: ['strings', 'protos', 'math', 'encoders', 'bindings', 'optional', 'all']", op)
if extOption, found := extensionMap[extType]; found {
return &extensionOption{extensionType: extType, option: extOption}, nil
} else {
keys := make([]string, 0)
for k, _ := range extensionMap {
keys = append(keys, k)
}
sort.Strings(keys)
extKeyName := make([]string, 0, len(keys))
for _, k := range keys {
extKeyName = append(extKeyName, "'"+k+"'")
}
joinedOptions := "['all', " + strings.Join(extKeyName, ", ") + "]"
return nil, fmt.Errorf("Unknown option: %s. Available options are: %s", extType, joinedOptions)
}

return &extensionOption{extensionType: extType, option: extOption}, nil
}

// setOption sets a number of options on the environment. returns an error if
Expand Down Expand Up @@ -811,8 +821,7 @@ func (e *Evaluator) loadExtensionOption(idx int, args []string) error {
argExtType := args[idx]
if argExtType == "all" {
// Load all extension types as a convenience
var extensionTypes = []string{"optional", "strings", "protos", "math", "encoders", "bindings"}
for _, val := range extensionTypes {
for val, _ := range extensionMap {
err := e.loadExtensionOptionType(val)
if err != nil {
return err
Expand Down
2 changes: 1 addition & 1 deletion repl/evaluator_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1040,7 +1040,7 @@ func TestProcessOptionError(t *testing.T) {
"'bogus'",
},
},
errorMsg: "extension: Unknown option: 'bogus'. Available options are: ['strings', 'protos', 'math', 'encoders', 'bindings', 'optional', 'all']",
errorMsg: "extension: Unknown option: 'bogus'. Available options are: ['all', 'bindings', 'encoders', 'lists', 'math', 'optional', 'protos', 'sets', 'strings']",
},
}

Expand Down

0 comments on commit 6df4157

Please sign in to comment.