Evaluate expression "Hello world! I'm " + name + "."
with CEL
passed as name.
import ( "github.com/google/cel-go/cel" "github.com/google/cel-go/checker/decls" ) d := cel.Declarations(decls.NewVar("name", decls.String)) env, err := cel.NewEnv(d) ast, iss := env.Compile(`"Hello world! I'm " + name + "."`) // Check iss for compilation errors. if iss.Err() != nil { log.Fatalln(iss.Err()) } prg, err := env.Program(ast) out, _, err := prg.Eval(map[string]interface{}{ "name": "CEL", }) fmt.Println(out) // Output:Hello world! I'm CEL.
Evaluate expression i.greet(you)
with:
i -> CEL you -> world greet -> "Hello %s! Nice to meet you, I'm %s."
First we need to declare two string variables and greet
function. NewInstanceOverload
must be used if we want to declare function which will operate on a type. First element of slice passed as argTypes
into NewInstanceOverload
is declaration of instance type. Next elements are parameters of function.
decls.NewVar("i", decls.String), decls.NewVar("you", decls.String), decls.NewFunction("greet", decls.NewInstanceOverload("string_greet_string", []*exprpb.Type{decls.String, decls.String}, decls.String)) ... // Create env and compile
Let's implement greet
function and pass it to program
. We will be using Binary
, because greet
function uses 2 parameters (1st instance, 2nd function parameter).
greetFunc := &functions.Overload{ Operator: "string_greet_string", Binary: func(lhs ref.Val, rhs ref.Val) ref.Val { return types.String( fmt.Sprintf("Hello %s! Nice to meet you, I'm %s.\n", rhs, lhs)) }} prg, err := env.Program(c, cel.Functions(greetFunc)) out, _, err := prg.Eval(map[string]interface{}{ "i": "CEL", "you": "world", }) fmt.Println(out) // Output:Hello world! Nice to meet you, I'm CEL.
Evaluate expression shake_hands(i,you)
with:
i -> CEL you -> world shake_hands -> "%s and %s are shaking hands."
In order to declare global function we need to use NewOverload
:
decls.NewVar("i", decls.String), decls.NewVar("you", decls.String), decls.NewFunction("shake_hands", decls.NewOverload("shake_hands_string_string", []*exprpb.Type{decls.String, decls.String}, decls.String)) ... // Create env and compile. shakeFunc := &functions.Overload{ Operator: "shake_hands_string_string", Binary: func(lhs ref.Val, rhs ref.Val) ref.Val { return types.String( fmt.Sprintf("%s and %s are shaking hands.\n", lhs, rhs)) }} prg, err := env.Program(c, cel.Functions(shakeFunc)) out, _, err := prg.Eval(map[string]interface{}{ "i": "CEL", "you": "world", }) fmt.Println(out) // Output:CEL and world are shaking hands.
For more examples of how to use CEL, see cel_test.go.