cel-go
cel-go copied to clipboard
Can we allow users to disable specific functions in Checker?
We only want to use a subset of CEL.
Current, we define ourself Library to replace the StdLib.
type filterLibrary struct {
functions map[string]bool
}
func (filterLibrary) LibraryName() string {
return "cel.j2gg0s.filter"
}
func (lib filterLibrary) CompileOptions() []cel.EnvOption {
opts := []cel.EnvOption{}
for _, fn := range stdlib.Functions() {
if !lib.functions[fn.Name()] {
continue
}
fn := fn
opts = append(opts, cel.Function(fn.Name(),
func(*decls.FunctionDecl) (*decls.FunctionDecl, error) {
return fn, nil
}))
}
for _, typ := range stdlib.Types() {
typ := typ
opts = append(opts, cel.Variable(typ.Name(), typ.Type()))
}
opts = append(opts, cel.Macros(cel.StandardMacros...))
return opts
}
func (filterLibrary) ProgramOptions() []cel.ProgramOption {
return []cel.ProgramOption{}
}
The ideal state would be to offer some options for subsetting on the StdLib. If you have suggestions for what you'd like to see there, I'd be happy to hear them and review a PR along these lines.
Since the standard library is a fixed set of functions and types, how people approach subsetting can sometimes be inclusive or exclusive, e.g. only these functions / overloads, everything except these functions / overloads.
Perhaps something like this:
type StdLibSubsetConfig struct {
IncludeFunctions []string
ExcludeFunctions []string
IncludeOverloads []string
ExcludeOverloads[]string
IncludeMacros []string
ExcludeMacros []string
}
func StdLibSubset(config *StdLibSubsetConfig) StdLibOption {
...
}
I'm tempted to package multiple configuration settings together rather than have separate options given how they can interact, but I'm open to suggestions.
The alternative might look like this:
func StdLibIncludeFunctions(names ...string) StdLibOption {
...
}
func StdLibExcludeFunctions(names ...string) StdLibOption {
...
}