func compile()

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
}