Skip to content

Commit

Permalink
Ext refactor (#561)
Browse files Browse the repository at this point in the history
* Refactor the extension libraries to use improved dispatching
* Migrate from Impl to Binding
  • Loading branch information
TristonianJones authored Jul 5, 2022
1 parent c10af62 commit 1ad5db5
Show file tree
Hide file tree
Showing 6 changed files with 164 additions and 501 deletions.
4 changes: 0 additions & 4 deletions ext/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,8 @@ go_library(
visibility = ["//visibility:public"],
deps = [
"//cel:go_default_library",
"//checker/decls:go_default_library",
"//common/types:go_default_library",
"//common/types/ref:go_default_library",
"//common/types/traits:go_default_library",
"//interpreter/functions:go_default_library",
"@org_golang_google_genproto//googleapis/api/expr/v1alpha1:go_default_library",
],
)

Expand Down
56 changes: 20 additions & 36 deletions ext/encoders.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,11 @@ package ext

import (
"encoding/base64"
"reflect"

"github.com/google/cel-go/cel"
"github.com/google/cel-go/checker/decls"
"github.com/google/cel-go/interpreter/functions"

exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1"
"github.com/google/cel-go/common/types"
"github.com/google/cel-go/common/types/ref"
)

// Encoders returns a cel.EnvOption to configure extended functions for string, byte, and object
Expand Down Expand Up @@ -57,42 +56,23 @@ type encoderLib struct{}

func (encoderLib) CompileOptions() []cel.EnvOption {
return []cel.EnvOption{
cel.Declarations(
decls.NewFunction("base64.decode",
decls.NewOverload("base64_decode_string",
[]*exprpb.Type{decls.String},
decls.Bytes)),
decls.NewFunction("base64.encode",
decls.NewOverload("base64_encode_bytes",
[]*exprpb.Type{decls.Bytes},
decls.String)),
),
cel.Function("base64.decode",
cel.Overload("base64_decode_string", []*cel.Type{cel.StringType}, cel.BytesType,
cel.UnaryBinding(func(str ref.Val) ref.Val {
s := str.(types.String)
return bytesOrError(base64DecodeString(string(s)))
}))),
cel.Function("base64.encode",
cel.Overload("base64_encode_bytes", []*cel.Type{cel.BytesType}, cel.StringType,
cel.UnaryBinding(func(bytes ref.Val) ref.Val {
b := bytes.(types.Bytes)
return stringOrError(base64EncodeBytes([]byte(b)))
}))),
}
}

func (encoderLib) ProgramOptions() []cel.ProgramOption {
wrappedBase64EncodeBytes := callInBytesOutString(base64EncodeBytes)
wrappedBase64DecodeString := callInStrOutBytes(base64DecodeString)
return []cel.ProgramOption{
cel.Functions(
&functions.Overload{
Operator: "base64.decode",
Unary: wrappedBase64DecodeString,
},
&functions.Overload{
Operator: "base64_decode_string",
Unary: wrappedBase64DecodeString,
},
&functions.Overload{
Operator: "base64.encode",
Unary: wrappedBase64EncodeBytes,
},
&functions.Overload{
Operator: "base64_encode_bytes",
Unary: wrappedBase64EncodeBytes,
},
),
}
return []cel.ProgramOption{}
}

func base64DecodeString(str string) ([]byte, error) {
Expand All @@ -102,3 +82,7 @@ func base64DecodeString(str string) ([]byte, error) {
func base64EncodeBytes(bytes []byte) (string, error) {
return base64.StdEncoding.EncodeToString(bytes), nil
}

var (
bytesListType = reflect.TypeOf([]byte{})
)
6 changes: 3 additions & 3 deletions ext/encoders_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package ext

import (
"fmt"
"strings"
"testing"

"github.com/google/cel-go/cel"
Expand Down Expand Up @@ -76,9 +77,8 @@ func TestEncoders(t *testing.T) {
tt.Fatalf("got %v, wanted error %s for expr: %s",
out.Value(), tc.err, tc.expr)
}
if tc.err != err.Error() {
tt.Errorf("got error %v, wanted error %s for expr: %s",
err, tc.err, tc.expr)
if !strings.Contains(err.Error(), tc.err) {
tt.Errorf("got error %v, wanted error %s for expr: %s", err, tc.err, tc.expr)
}
} else if err != nil {
tt.Fatal(err)
Expand Down
Loading

0 comments on commit 1ad5db5

Please sign in to comment.