Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,4 @@ proto/checked.pb.go
proto/syntax.pb.go
*~
MODULE.bazel.lock
.ijwb/
1 change: 1 addition & 0 deletions MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ use_repo(
"in_gopkg_yaml_v3",
"org_golang_google_genproto_googleapis_api",
"org_golang_google_genproto_googleapis_rpc",
"org_golang_google_grpc",
Comment thread
ChinmayMadeshi marked this conversation as resolved.
Outdated
"org_golang_google_protobuf",
"org_golang_x_text",
)
9 changes: 6 additions & 3 deletions WORKSPACE
Original file line number Diff line number Diff line change
Expand Up @@ -45,10 +45,10 @@ http_archive(
urls = ["https://github.com/protocolbuffers/protobuf/archive/v3.21.5.zip"],
)

load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")
load("@bazel_gazelle//:deps.bzl", "gazelle_dependencies", "go_repository")
load("@com_google_googleapis//:repository_rules.bzl", "switched_rules_by_language")
load("@com_google_protobuf//:protobuf_deps.bzl", "protobuf_deps")
load("@io_bazel_rules_go//go:deps.bzl", "go_register_toolchains", "go_rules_dependencies")

switched_rules_by_language(
name = "com_google_googleapis_imports",
Expand Down Expand Up @@ -101,8 +101,8 @@ go_repository(
go_repository(
name = "dev_cel_expr",
importpath = "cel.dev/expr",
sum = "h1:K4KOtPCJQjVggkARsjG9RWXP6O4R73aHeJMa/dmCQQg=",
version = "v0.23.1",
sum = "h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=",
version = "v0.24.0",
)

# local_repository(
Expand Down Expand Up @@ -158,12 +158,15 @@ go_register_toolchains(version = "1.22.0")
gazelle_dependencies()

load("@rules_proto//proto:repositories.bzl", "rules_proto_dependencies")

rules_proto_dependencies()

load("@rules_proto//proto:setup.bzl", "rules_proto_setup")

rules_proto_setup()

load("@rules_proto//proto:toolchains.bzl", "rules_proto_toolchains")

rules_proto_toolchains()

protobuf_deps()
9 changes: 6 additions & 3 deletions cel/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ go_library(
"decls.go",
"env.go",
"folding.go",
"io.go",
"inlining.go",
"io.go",
"library.go",
"macro.go",
"optimizer.go",
Expand Down Expand Up @@ -44,9 +44,11 @@ go_library(
"//parser:go_default_library",
"@dev_cel_expr//:expr",
"@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library",
"@org_golang_google_genproto_googleapis_rpc//status",
"@org_golang_google_protobuf//proto:go_default_library",
"@org_golang_google_protobuf//reflect/protodesc:go_default_library",
"@org_golang_google_protobuf//reflect/protoreflect:go_default_library",
"@org_golang_google_grpc//status",
"@org_golang_google_protobuf//reflect/protoregistry:go_default_library",
"@org_golang_google_protobuf//types/descriptorpb:go_default_library",
"@org_golang_google_protobuf//types/dynamicpb:go_default_library",
Expand All @@ -64,8 +66,8 @@ go_test(
"decls_test.go",
"env_test.go",
"folding_test.go",
"io_test.go",
"inlining_test.go",
"io_test.go",
"optimizer_test.go",
"prompt_test.go",
"validator_test.go",
Expand All @@ -90,8 +92,9 @@ go_test(
"//test/proto2pb:go_default_library",
"//test/proto3pb:go_default_library",
"@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library",
"@org_golang_google_protobuf//proto:go_default_library",
"@org_golang_google_genproto_googleapis_rpc//status",
"@org_golang_google_protobuf//encoding/prototext:go_default_library",
"@org_golang_google_protobuf//proto:go_default_library",
"@org_golang_google_protobuf//types/known/structpb:go_default_library",
"@org_golang_google_protobuf//types/known/wrapperspb:go_default_library",
],
Expand Down
51 changes: 51 additions & 0 deletions cel/io.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import (
"reflect"

"google.golang.org/protobuf/proto"
"google.golang.org/grpc/status"

"github.com/google/cel-go/common"
"github.com/google/cel-go/common/ast"
Expand All @@ -30,6 +31,7 @@ import (

celpb "cel.dev/expr"
exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1"
rpcpb "google.golang.org/genproto/googleapis/rpc/status"
anypb "google.golang.org/protobuf/types/known/anypb"
)

Expand Down Expand Up @@ -126,6 +128,55 @@ func ValueAsAlphaProto(res ref.Val) (*exprpb.Value, error) {
return alpha, err
}

// RPCStatusToEvalErrorStatus converts an RPC status to a celpb status. Status value is intended to
// be wire and field compatible with `google.rpc.Status`.
func RPCStatusToEvalErrorStatus(s *rpcpb.Status) (*celpb.Status, error) {
Comment thread
ChinmayMadeshi marked this conversation as resolved.
Outdated
Comment thread
ChinmayMadeshi marked this conversation as resolved.
Outdated
var celpbStatus celpb.Status
statusVal, err := proto.Marshal(s)
if err != nil {
return nil, err
}
err = proto.Unmarshal(statusVal, &celpbStatus)
if err != nil {
return nil, err
}
return &celpbStatus, nil
}

// RefValToExprValue converts between ref.Val and cel.expr.ExprValue.
// The result ExprValue is the serialized proto form.
func RefValToExprValue(res ref.Val) (*celpb.ExprValue, error) {
Comment thread
ChinmayMadeshi marked this conversation as resolved.
Outdated
switch res := res.(type) {
case *types.Unknown:
return &celpb.ExprValue{
Kind: &celpb.ExprValue_Unknown{
Unknown: &celpb.UnknownSet{
Exprs: res.IDs(),
},
}}, nil
case *types.Err:
s := status.Convert(res.Unwrap()).Proto()
Comment thread
ChinmayMadeshi marked this conversation as resolved.
Outdated
statusVal, err := RPCStatusToEvalErrorStatus(s)
if err != nil {
return nil, err
}
return &celpb.ExprValue{
Kind: &celpb.ExprValue_Error{
Error: &celpb.ErrorSet{
Errors: []*celpb.Status{statusVal},
},
},
}, nil
default:
val, err := ValueAsProto(res)
if err != nil {
return nil, err
}
return &celpb.ExprValue{
Kind: &celpb.ExprValue_Value{Value: val}}, nil
}
}

// ValueAsProto converts between ref.Val and cel.expr.Value.
// The result Value is the serialized proto form. The ref.Val must not be error or unknown.
func ValueAsProto(res ref.Val) (*celpb.Value, error) {
Expand Down
117 changes: 117 additions & 0 deletions cel/io_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,13 @@ import (
"github.com/google/cel-go/checker/decls"
celast "github.com/google/cel-go/common/ast"
"github.com/google/cel-go/common/operators"
"github.com/google/cel-go/common/types/ref"
"github.com/google/cel-go/common/types"

proto3pb "github.com/google/cel-go/test/proto3pb"
exprpb "google.golang.org/genproto/googleapis/api/expr/v1alpha1"
rpcpb "google.golang.org/genproto/googleapis/rpc/status"
anypb "google.golang.org/protobuf/types/known/anypb"
)

func TestRefValueToValueRoundTrip(t *testing.T) {
Expand Down Expand Up @@ -193,6 +196,120 @@ func TestExprToString(t *testing.T) {
}
}

func TestRPCStatusToEvalErrorStatus(t *testing.T) {
tests := []struct {
name string
rpcStatus *rpcpb.Status
expectedCode int32
expectedMessage string
expectedDetails []*anypb.Any
}{
{
name: "empty status",
rpcStatus: &rpcpb.Status{},
expectedCode: 0,
expectedMessage: "",
expectedDetails: nil,
},
{
name: "status with code and message",
rpcStatus: &rpcpb.Status{
Code: int32(3),
Message: "test message",
},
expectedCode: 3,
expectedMessage: "test message",
expectedDetails: nil,
},
{
name: "status with code, message and details",
rpcStatus: &rpcpb.Status{
Code: int32(3),
Message: "test message",
Details: []*anypb.Any{&anypb.Any{Value: []byte("test detail")}},
},
expectedCode: 3,
expectedMessage: "test message",
expectedDetails: []*anypb.Any{&anypb.Any{Value: []byte("test detail")}},
},
}
for _, tst := range tests {
tc := tst
t.Run(tc.name, func(t *testing.T) {
evalStatus, err := RPCStatusToEvalErrorStatus(tc.rpcStatus)
if err != nil {
t.Fatalf("RPCStatusToEvalErrorStatus(%v) failed: %v", tc.rpcStatus, err)
}
if evalStatus.GetCode() != tc.expectedCode {
t.Errorf("got code %v, wanted %v", evalStatus.GetCode(), tc.expectedCode)
}
if evalStatus.GetMessage() != tc.expectedMessage {
t.Errorf("got message %v, wanted %v", evalStatus.GetMessage(), tc.expectedMessage)
}
if len(evalStatus.GetDetails()) != len(tc.expectedDetails) {
t.Errorf("got details %v, wanted %v", evalStatus.GetDetails(), tc.expectedDetails)
}
for i, detail := range evalStatus.GetDetails() {
if !proto.Equal(detail, tc.expectedDetails[i]) {
t.Errorf("got detail %v, wanted %v", detail, tc.expectedDetails[i])
}
}
})
}
}

func TestRefValToExprValue(t *testing.T) {
tests := []struct {
name string
refVal ref.Val
expectError bool
}{
{
name: "unknown value",
refVal: types.NewUnknown(1, nil),
expectError: false,
},
{
name: "error value",
refVal: types.NewErr("test error"),
expectError: false,
},
{
name: "bool value",
refVal: types.Bool(true),
expectError: false,
},
{
name: "string value",
refVal: types.String("test"),
expectError: false,
},
{
name: "int value",
refVal: types.Int(1),
expectError: false,
},
}
for _, tst := range tests {
tc := tst
t.Run(tc.name, func(t *testing.T) {
exprVal, err := RefValToExprValue(tc.refVal)
if tc.expectError {
if err == nil {
t.Errorf("RefValToExprValue(%v) expected error, got %v", tc.refVal, exprVal)
}
} else {
if err != nil {
t.Errorf("RefValToExprValue(%v) failed with error: %v", tc.refVal, err)
}
if exprVal == nil {
t.Errorf("RefValToExprValue(%v) expected value, got nil", tc.refVal)
}
}
})
}
}

func TestAstToStringNil(t *testing.T) {
expr, err := AstToString(nil)
if err == nil || !strings.Contains(err.Error(), "unsupported expr") {
Expand Down
3 changes: 2 additions & 1 deletion conformance/BUILD.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ _TESTS_TO_SKIP = [
"fields/qualified_identifier_resolution/map_value_repeat_key_heterogeneous",
"macros/map/map_extract_keys",
"timestamps/duration_converters/get_milliseconds",
"optionals/optionals/map_optional_select_has",
Comment thread
TristonianJones marked this conversation as resolved.

# Temporarily failing tests, need a spec update
"string_ext/value_errors/indexof_out_of_range,lastindexof_out_of_range",
Expand Down Expand Up @@ -84,9 +85,9 @@ go_test(
"@com_github_google_go_cmp//cmp:go_default_library",
"@dev_cel_expr//:expr",
"@dev_cel_expr//conformance:go_default_library",
"@dev_cel_expr//conformance/test:go_default_library",
"@dev_cel_expr//conformance/proto2:go_default_library",
"@dev_cel_expr//conformance/proto3:go_default_library",
"@dev_cel_expr//conformance/test:go_default_library",
"@io_bazel_rules_go//go/runfiles",
"@org_golang_google_genproto_googleapis_api//expr/v1alpha1:go_default_library",
"@org_golang_google_protobuf//encoding/prototext:go_default_library",
Expand Down
2 changes: 1 addition & 1 deletion conformance/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ module github.com/google/cel-go/conformance
go 1.22.0

require (
cel.dev/expr v0.23.1
cel.dev/expr v0.24.0
github.com/bazelbuild/rules_go v0.49.0
github.com/google/cel-go v0.21.0
github.com/google/go-cmp v0.6.0
Expand Down
4 changes: 2 additions & 2 deletions conformance/go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cel.dev/expr v0.23.1 h1:K4KOtPCJQjVggkARsjG9RWXP6O4R73aHeJMa/dmCQQg=
cel.dev/expr v0.23.1/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
github.com/bazelbuild/rules_go v0.49.0 h1:5vCbuvy8Q11g41lseGJDc5vxhDjJtfxr6nM/IC4VmqM=
Expand Down
7 changes: 5 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,19 @@ go 1.22.0
toolchain go1.23.0

require (
cel.dev/expr v0.23.1
cel.dev/expr v0.24.0
github.com/antlr4-go/antlr/v4 v4.13.0
github.com/stoewer/go-strcase v1.2.0
google.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7
google.golang.org/grpc v1.65.0
google.golang.org/protobuf v1.34.2
gopkg.in/yaml.v3 v3.0.1
)

require golang.org/x/sys v0.21.0 // indirect

require (
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc // indirect
golang.org/x/text v0.22.0
google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7
)
8 changes: 6 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
cel.dev/expr v0.23.1 h1:K4KOtPCJQjVggkARsjG9RWXP6O4R73aHeJMa/dmCQQg=
cel.dev/expr v0.23.1/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
cel.dev/expr v0.24.0 h1:56OvJKSH3hDGL0ml5uSxZmz3/3Pq4tJ+fb1unVLAFcY=
cel.dev/expr v0.24.0/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI=
github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
Expand All @@ -15,12 +15,16 @@ github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc h1:mCRnTeVUjcrhlRmO0VK8a6k6Rrf6TF9htwo2pJVSjIU=
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws=
golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
google.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7 h1:YcyjlL1PRr2Q17/I0dPk2JmYS5CDXfcdb2Z3YRioEbw=
google.golang.org/genproto/googleapis/api v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7 h1:2035KHhUv+EpyB+hWgJnaWKJOdX1E95w2S8Rr4uWKTs=
google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc=
google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ=
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
Expand Down
Loading