in mito.go [385:424]
func compile(src, root string, fold, details, coverage bool, libs ...cel.EnvOption) (cel.Program, *cel.Ast, *lib.Coverage, error) {
opts := append([]cel.EnvOption{
cel.Declarations(decls.NewVar(root, decls.Dyn)),
}, libs...)
env, err := cel.NewEnv(opts...)
if err != nil {
return nil, nil, nil, fmt.Errorf("failed to create env: %v", err)
}
ast, iss := env.Compile(src)
if iss.Err() != nil {
return nil, nil, nil, fmt.Errorf("failed compilation: %v", iss.Err())
}
if fold {
folder, err := cel.NewConstantFoldingOptimizer()
if err != nil {
return nil, nil, nil, fmt.Errorf("failed folding optimization: %v", err)
}
ast, iss = cel.NewStaticOptimizer(folder).Optimize(env, ast)
if iss.Err() != nil {
return nil, nil, nil, fmt.Errorf("failed optimization: %v", iss.Err())
}
}
var cov *lib.Coverage
var progOpts []cel.ProgramOption
if coverage {
cov = lib.NewCoverage(ast)
progOpts = []cel.ProgramOption{cov.ProgramOption()}
}
if details {
progOpts = append(progOpts, cel.EvalOptions(cel.OptTrackState))
}
prg, err := env.Program(ast, progOpts...)
if err != nil {
return nil, nil, nil, fmt.Errorf("failed program instantiation: %v", err)
}
return prg, ast, cov, nil
}