| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 | // Copyright 2022 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<int64, Reference> 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<int64, Type> 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<example.proto.MyMessage>`.  message ListType {    // The element type.    Type elem_type = 1;  }  // Map type with parameterized key and value types, e.g. `map<string, int>`.  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<timestamp>`.    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<E>`    // 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<A>` and `int<int>` are not disjoint. Likewise,      // `map<string, string>` is not disjoint from `map<K, V>`.      //      // 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,V>(K key, map<K, V> 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;}
 |