const _ … const featureEnableMacroCallTracking … const featureCrossTypeNumericComparisons … const featureEagerlyValidateDeclarations … const featureDefaultUTCTimeZone … const featureVariadicLogicalASTs … const featureEnableErrorOnBadPresenceTest … type EnvOption … // ClearMacros options clears all parser macros. // // Clearing macros will ensure CEL expressions can only contain linear evaluation paths, as // comprehensions such as `all` and `exists` are enabled only via macros. func ClearMacros() EnvOption { … } // CustomTypeAdapter swaps the default types.Adapter implementation with a custom one. // // Note: This option must be specified before the Types and TypeDescs options when used together. func CustomTypeAdapter(adapter types.Adapter) EnvOption { … } // CustomTypeProvider replaces the types.Provider implementation with a custom one. // // The `provider` variable type may either be types.Provider or ref.TypeProvider (deprecated) // // Note: This option must be specified before the Types and TypeDescs options when used together. func CustomTypeProvider(provider any) EnvOption { … } // Declarations option extends the declaration set configured in the environment. // // Note: Declarations will by default be appended to the pre-existing declaration set configured // for the environment. The NewEnv call builds on top of the standard CEL declarations. For a // purely custom set of declarations use NewCustomEnv. func Declarations(decls ...*exprpb.Decl) EnvOption { … } // EagerlyValidateDeclarations ensures that any collisions between configured declarations are caught // at the time of the `NewEnv` call. // // Eagerly validating declarations is also useful for bootstrapping a base `cel.Env` value. // Calls to base `Env.Extend()` will be significantly faster when declarations are eagerly validated // as declarations will be collision-checked at most once and only incrementally by way of `Extend` // // Disabled by default as not all environments are used for type-checking. func EagerlyValidateDeclarations(enabled bool) EnvOption { … } // HomogeneousAggregateLiterals disables mixed type list and map literal values. // // Note, it is still possible to have heterogeneous aggregates when provided as variables to the // expression, as well as via conversion of well-known dynamic types, or with unchecked // expressions. func HomogeneousAggregateLiterals() EnvOption { … } // variadicLogicalOperatorASTs flatten like-operator chained logical expressions into a single // variadic call with N-terms. This behavior is useful when serializing to a protocol buffer as // it will reduce the number of recursive calls needed to deserialize the AST later. // // For example, given the following expression the call graph will be rendered accordingly: // // expression: a && b && c && (d || e) // ast: call(_&&_, [a, b, c, call(_||_, [d, e])]) func variadicLogicalOperatorASTs() EnvOption { … } // Macros option extends the macro set configured in the environment. // // Note: This option must be specified after ClearMacros if used together. func Macros(macros ...Macro) EnvOption { … } // Container sets the container for resolving variable names. Defaults to an empty container. // // If all references within an expression are relative to a protocol buffer package, then // specifying a container of `google.type` would make it possible to write expressions such as // `Expr{expression: 'a < b'}` instead of having to write `google.type.Expr{...}`. func Container(name string) EnvOption { … } // Abbrevs configures a set of simple names as abbreviations for fully-qualified names. // // An abbreviation (abbrev for short) is a simple name that expands to a fully-qualified name. // Abbreviations can be useful when working with variables, functions, and especially types from // multiple namespaces: // // // CEL object construction // qual.pkg.version.ObjTypeName{ // field: alt.container.ver.FieldTypeName{value: ...} // } // // Only one the qualified names above may be used as the CEL container, so at least one of these // references must be a long qualified name within an otherwise short CEL program. Using the // following abbreviations, the program becomes much simpler: // // // CEL Go option // Abbrevs("qual.pkg.version.ObjTypeName", "alt.container.ver.FieldTypeName") // // Simplified Object construction // ObjTypeName{field: FieldTypeName{value: ...}} // // There are a few rules for the qualified names and the simple abbreviations generated from them: // - Qualified names must be dot-delimited, e.g. `package.subpkg.name`. // - The last element in the qualified name is the abbreviation. // - Abbreviations must not collide with each other. // - The abbreviation must not collide with unqualified names in use. // // Abbreviations are distinct from container-based references in the following important ways: // - Abbreviations must expand to a fully-qualified name. // - Expanded abbreviations do not participate in namespace resolution. // - Abbreviation expansion is done instead of the container search for a matching identifier. // - Containers follow C++ namespace resolution rules with searches from the most qualified name // // to the least qualified name. // // - Container references within the CEL program may be relative, and are resolved to fully // // qualified names at either type-check time or program plan time, whichever comes first. // // If there is ever a case where an identifier could be in both the container and as an // abbreviation, the abbreviation wins as this will ensure that the meaning of a program is // preserved between compilations even as the container evolves. func Abbrevs(qualifiedNames ...string) EnvOption { … } type customTypeRegistry … // Types adds one or more type declarations to the environment, allowing for construction of // type-literals whose definitions are included in the common expression built-in set. // // The input types may either be instances of `proto.Message` or `ref.Type`. Any other type // provided to this option will result in an error. // // Well-known protobuf types within the `google.protobuf.*` package are included in the standard // environment by default. // // Note: This option must be specified after the CustomTypeProvider option when used together. func Types(addTypes ...any) EnvOption { … } // TypeDescs adds type declarations from any protoreflect.FileDescriptor, protoregistry.Files, // google.protobuf.FileDescriptorProto or google.protobuf.FileDescriptorSet provided. // // Note that messages instantiated from these descriptors will be *dynamicpb.Message values // rather than the concrete message type. // // TypeDescs are hermetic to a single Env object, but may be copied to other Env values via // extension or by re-using the same EnvOption with another NewEnv() call. func TypeDescs(descs ...any) EnvOption { … } func registerFileSet(reg customTypeRegistry, fileSet *descpb.FileDescriptorSet) error { … } func registerFiles(reg customTypeRegistry, files *protoregistry.Files) error { … } type ProgramOption … // CustomDecorator appends an InterpreterDecorator to the program. // // InterpretableDecorators can be used to inspect, alter, or replace the Program plan. func CustomDecorator(dec interpreter.InterpretableDecorator) ProgramOption { … } // Functions adds function overloads that extend or override the set of CEL built-ins. // // Deprecated: use Function() instead to declare the function, its overload signatures, // and the overload implementations. func Functions(funcs ...*functions.Overload) ProgramOption { … } // Globals sets the global variable values for a given program. These values may be shadowed by // variables with the same name provided to the Eval() call. If Globals is used in a Library with // a Lib EnvOption, vars may shadow variables provided by previously added libraries. // // The vars value may either be an `interpreter.Activation` instance or a `map[string]any`. func Globals(vars any) ProgramOption { … } // OptimizeRegex provides a way to replace the InterpretableCall for regex functions. This can be used // to compile regex string constants at program creation time and report any errors and then use the // compiled regex for all regex function invocations. func OptimizeRegex(regexOptimizations ...*interpreter.RegexOptimization) ProgramOption { … } type EvalOption … const OptTrackState … const OptExhaustiveEval … const OptOptimize … const OptPartialEval … const OptTrackCost … const OptCheckStringFormat … // EvalOptions sets one or more evaluation options which may affect the evaluation or Result. func EvalOptions(opts ...EvalOption) ProgramOption { … } // InterruptCheckFrequency configures the number of iterations within a comprehension to evaluate // before checking whether the function evaluation has been interrupted. func InterruptCheckFrequency(checkFrequency uint) ProgramOption { … } // CostEstimatorOptions configure type-check time options for estimating expression cost. func CostEstimatorOptions(costOpts ...checker.CostOption) EnvOption { … } // CostTrackerOptions configures a set of options for cost-tracking. // // Note, CostTrackerOptions is a no-op unless CostTracking is also enabled. func CostTrackerOptions(costOpts ...interpreter.CostTrackerOption) ProgramOption { … } // CostTracking enables cost tracking and registers a ActualCostEstimator that can optionally provide a runtime cost estimate for any function calls. func CostTracking(costEstimator interpreter.ActualCostEstimator) ProgramOption { … } // CostLimit enables cost tracking and sets configures program evaluation to exit early with a // "runtime cost limit exceeded" error if the runtime cost exceeds the costLimit. // The CostLimit is a metric that corresponds to the number and estimated expense of operations // performed while evaluating an expression. It is indicative of CPU usage, not memory usage. func CostLimit(costLimit uint64) ProgramOption { … } func fieldToCELType(field protoreflect.FieldDescriptor) (*Type, error) { … } func fieldToVariable(field protoreflect.FieldDescriptor) (EnvOption, error) { … } // DeclareContextProto returns an option to extend CEL environment with declarations from the given context proto. // Each field of the proto defines a variable of the same name in the environment. // https://github.com/google/cel-spec/blob/master/doc/langdef.md#evaluation-environment func DeclareContextProto(descriptor protoreflect.MessageDescriptor) EnvOption { … } // ContextProtoVars uses the fields of the input proto.Messages as top-level variables within an Activation. // // Consider using with `DeclareContextProto` to simplify variable type declarations and publishing when using // protocol buffers. func ContextProtoVars(ctx proto.Message) (interpreter.Activation, error) { … } // EnableMacroCallTracking ensures that call expressions which are replaced by macros // are tracked in the `SourceInfo` of parsed and checked expressions. func EnableMacroCallTracking() EnvOption { … } // CrossTypeNumericComparisons makes it possible to compare across numeric types, e.g. double < int func CrossTypeNumericComparisons(enabled bool) EnvOption { … } // DefaultUTCTimeZone ensures that time-based operations use the UTC timezone rather than the // input time's local timezone. func DefaultUTCTimeZone(enabled bool) EnvOption { … } // features sets the given feature flags. See list of Feature constants above. func features(flag int, enabled bool) EnvOption { … } // ParserRecursionLimit adjusts the AST depth the parser will tolerate. // Defaults defined in the parser package. func ParserRecursionLimit(limit int) EnvOption { … } // ParserExpressionSizeLimit adjusts the number of code points the expression parser is allowed to parse. // Defaults defined in the parser package. func ParserExpressionSizeLimit(limit int) EnvOption { … } func maybeInteropProvider(provider any) (types.Provider, error) { … }