# Examples ## Simple example using builtin operators Evaluate expression `"Hello world! I'm " + name + "."` with `CEL` passed as name. ```go import "github.com/google/cel-go/cel" env, err := cel.NewEnv(cel.Variable("name", cel.StringType)) // Check err for environment setup errors. if err != nil { log.Fatalln(err) } 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. ``` [Source code](simple_test.go) ## Custom function on string type 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. `Function` must be used if we want to declare an extension to CEL. The `MemberOverload` declares an overload id, a list of arguments where the first element the `argTypes` slice is the target type of the member function. The remaining argument types are the signature of the member method. ```go env, _ := cel.NewEnv( cel.Variable("i", cel.StringType), cel.Variable("you", cel.StringType), cel.Function("greet", cel.MemberOverload("string_greet_string", []*cel.Type{cel.StringType, cel.StringType}, cel.StringType, cel.BinaryBinding(func (lhs, rhs ref.Val) ref.Val { return types.String( fmt.Sprintf("Hello %s! Nice to meet you, I'm %s.\n", rhs, lhs)) }, ), ), ), ) prg, _ := env.Program(c) out, _, _ := prg.Eval(map[string]interface{}{ "i": "CEL", "you": "world", }) fmt.Println(out) // Output:Hello world! Nice to meet you, I'm CEL. ``` [Source code](custom_instance_function_test.go) ## Define custom global function 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 `Overload` instead of `MemberOverload` in the `Function` option: ```go env, _ := cel.NewEnv( cel.Variable("i", cel.StringType), cel.Variable("you", cel.StringType), cel.Function("shake_hands", cel.Overload("shake_hands_string_string", []*cel.Type{cel.StringType, cel.StringType}, cel.StringType, cel.BinaryBinding(func(lhs, rhs ref.Val) ref.Val { return types.String( fmt.Sprintf("%s and %s are shaking hands.\n", lhs, rhs)) }, ), ), ), ) prg, _ := env.Program(c) out, _, _ := prg.Eval(map[string]interface{}{ "i": "CEL", "you": "world", }) fmt.Println(out) // Output:CEL and world are shaking hands. ``` [Source code](custom_global_function_test.go) For more examples of how to use CEL, see [cel_test.go](https://github.com/google/cel-go/tree/master/cel/cel_test.go).