// Copyright 2024 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. syntax = "proto3"; package google.api.expr.v1alpha1; import "google/api/expr/v1alpha1/syntax.proto"; import "google/protobuf/empty.proto"; import "google/protobuf/struct.proto"; option cc_enable_arenas = true; option go_package = "google.golang.org/genproto/googleapis/api/expr/v1alpha1;expr"; option java_multiple_files = true; option java_outer_classname = "DeclProto"; option java_package = "com.google.api.expr.v1alpha1"; // Protos for representing CEL declarations and typed checked expressions. // A CEL expression which has been successfully type checked. message CheckedExpr { // A map from expression ids to resolved references. // // The following entries are in this table: // // - An Ident or Select expression is represented here if it resolves to a // declaration. For instance, if `a.b.c` is represented by // `select(select(id(a), b), c)`, and `a.b` resolves to a declaration, // while `c` is a field selection, then the reference is attached to the // nested select expression (but not to the id or or the outer select). // In turn, if `a` resolves to a declaration and `b.c` are field selections, // the reference is attached to the ident expression. // - Every Call expression has an entry here, identifying the function being // called. // - Every CreateStruct expression for a message has an entry, identifying // the message. map reference_map = 2; // A map from expression ids to types. // // Every expression node which has a type different than DYN has a mapping // here. If an expression has type DYN, it is omitted from this map to save // space. map type_map = 3; // The source info derived from input that generated the parsed `expr` and // any optimizations made during the type-checking pass. SourceInfo source_info = 5; // The expr version indicates the major / minor version number of the `expr` // representation. // // The most common reason for a version change will be to indicate to the CEL // runtimes that transformations have been performed on the expr during static // analysis. In some cases, this will save the runtime the work of applying // the same or similar transformations prior to evaluation. string expr_version = 6; // The checked expression. Semantically equivalent to the parsed `expr`, but // may have structural differences. Expr expr = 4; } // Represents a CEL type. message Type { // List type with typed elements, e.g. `list`. message ListType { // The element type. Type elem_type = 1; } // Map type with parameterized key and value types, e.g. `map`. message MapType { // The type of the key. Type key_type = 1; // The type of the value. Type value_type = 2; } // Function type with result and arg types. message FunctionType { // Result type of the function. Type result_type = 1; // Argument types of the function. repeated Type arg_types = 2; } // Application defined abstract type. message AbstractType { // The fully qualified name of this abstract type. string name = 1; // Parameter types for this abstract type. repeated Type parameter_types = 2; } // CEL primitive types. enum PrimitiveType { // Unspecified type. PRIMITIVE_TYPE_UNSPECIFIED = 0; // Boolean type. BOOL = 1; // Int64 type. // // Proto-based integer values are widened to int64. INT64 = 2; // Uint64 type. // // Proto-based unsigned integer values are widened to uint64. UINT64 = 3; // Double type. // // Proto-based float values are widened to double values. DOUBLE = 4; // String type. STRING = 5; // Bytes type. BYTES = 6; } // Well-known protobuf types treated with first-class support in CEL. enum WellKnownType { // Unspecified type. WELL_KNOWN_TYPE_UNSPECIFIED = 0; // Well-known protobuf.Any type. // // Any types are a polymorphic message type. During type-checking they are // treated like `DYN` types, but at runtime they are resolved to a specific // message type specified at evaluation time. ANY = 1; // Well-known protobuf.Timestamp type, internally referenced as `timestamp`. TIMESTAMP = 2; // Well-known protobuf.Duration type, internally referenced as `duration`. DURATION = 3; } // The kind of type. oneof type_kind { // Dynamic type. google.protobuf.Empty dyn = 1; // Null value. google.protobuf.NullValue null = 2; // Primitive types: `true`, `1u`, `-2.0`, `'string'`, `b'bytes'`. PrimitiveType primitive = 3; // Wrapper of a primitive type, e.g. `google.protobuf.Int64Value`. PrimitiveType wrapper = 4; // Well-known protobuf type such as `google.protobuf.Timestamp`. WellKnownType well_known = 5; // Parameterized list with elements of `list_type`, e.g. `list`. ListType list_type = 6; // Parameterized map with typed keys and values. MapType map_type = 7; // Function type. FunctionType function = 8; // Protocol buffer message type. // // The `message_type` string specifies the qualified message type name. For // example, `google.plus.Profile`. string message_type = 9; // Type param type. // // The `type_param` string specifies the type parameter name, e.g. `list` // would be a `list_type` whose element type was a `type_param` type // named `E`. string type_param = 10; // Type type. // // The `type` value specifies the target type. e.g. int is type with a // target type of `Primitive.INT`. Type type = 11; // Error type. // // During type-checking if an expression is an error, its type is propagated // as the `ERROR` type. This permits the type-checker to discover other // errors present in the expression. google.protobuf.Empty error = 12; // Abstract, application defined type. AbstractType abstract_type = 14; } } // Represents a declaration of a named value or function. // // A declaration is part of the contract between the expression, the agent // evaluating that expression, and the caller requesting evaluation. message Decl { // Identifier declaration which specifies its type and optional `Expr` value. // // An identifier without a value is a declaration that must be provided at // evaluation time. An identifier with a value should resolve to a constant, // but may be used in conjunction with other identifiers bound at evaluation // time. message IdentDecl { // Required. The type of the identifier. Type type = 1; // The constant value of the identifier. If not specified, the identifier // must be supplied at evaluation time. Constant value = 2; // Documentation string for the identifier. string doc = 3; } // Function declaration specifies one or more overloads which indicate the // function's parameter types and return type. // // Functions have no observable side-effects (there may be side-effects like // logging which are not observable from CEL). message FunctionDecl { // An overload indicates a function's parameter types and return type, and // may optionally include a function body described in terms of // [Expr][google.api.expr.v1alpha1.Expr] values. // // Functions overloads are declared in either a function or method // call-style. For methods, the `params[0]` is the expected type of the // target receiver. // // Overloads must have non-overlapping argument types after erasure of all // parameterized type variables (similar as type erasure in Java). message Overload { // Required. Globally unique overload name of the function which reflects // the function name and argument types. // // This will be used by a [Reference][google.api.expr.v1alpha1.Reference] // to indicate the `overload_id` that was resolved for the function // `name`. string overload_id = 1; // List of function parameter [Type][google.api.expr.v1alpha1.Type] // values. // // Param types are disjoint after generic type parameters have been // replaced with the type `DYN`. Since the `DYN` type is compatible with // any other type, this means that if `A` is a type parameter, the // function types `int` and `int` are not disjoint. Likewise, // `map` is not disjoint from `map`. // // When the `result_type` of a function is a generic type param, the // type param name also appears as the `type` of on at least one params. repeated Type params = 2; // The type param names associated with the function declaration. // // For example, `function ex(K key, map map) : V` would yield // the type params of `K, V`. repeated string type_params = 3; // Required. The result type of the function. For example, the operator // `string.isEmpty()` would have `result_type` of `kind: BOOL`. Type result_type = 4; // Whether the function is to be used in a method call-style `x.f(...)` // or a function call-style `f(x, ...)`. // // For methods, the first parameter declaration, `params[0]` is the // expected type of the target receiver. bool is_instance_function = 5; // Documentation string for the overload. string doc = 6; } // Required. List of function overloads, must contain at least one overload. repeated Overload overloads = 1; } // The fully qualified name of the declaration. // // Declarations are organized in containers and this represents the full path // to the declaration in its container, as in `google.api.expr.Decl`. // // Declarations used as // [FunctionDecl.Overload][google.api.expr.v1alpha1.Decl.FunctionDecl.Overload] // parameters may or may not have a name depending on whether the overload is // function declaration or a function definition containing a result // [Expr][google.api.expr.v1alpha1.Expr]. string name = 1; // Required. The declaration kind. oneof decl_kind { // Identifier declaration. IdentDecl ident = 2; // Function declaration. FunctionDecl function = 3; } } // Describes a resolved reference to a declaration. message Reference { // The fully qualified name of the declaration. string name = 1; // For references to functions, this is a list of `Overload.overload_id` // values which match according to typing rules. // // If the list has more than one element, overload resolution among the // presented candidates must happen at runtime because of dynamic types. The // type checker attempts to narrow down this list as much as possible. // // Empty if this is not a reference to a // [Decl.FunctionDecl][google.api.expr.v1alpha1.Decl.FunctionDecl]. repeated string overload_id = 3; // For references to constants, this may contain the value of the // constant if known at compile time. Constant value = 4; }