1*d5c09012SAndroid Build Coastguard Worker// Copyright 2023 Google LLC 2*d5c09012SAndroid Build Coastguard Worker// 3*d5c09012SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*d5c09012SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*d5c09012SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*d5c09012SAndroid Build Coastguard Worker// 7*d5c09012SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*d5c09012SAndroid Build Coastguard Worker// 9*d5c09012SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*d5c09012SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*d5c09012SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*d5c09012SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*d5c09012SAndroid Build Coastguard Worker// limitations under the License. 14*d5c09012SAndroid Build Coastguard Worker 15*d5c09012SAndroid Build Coastguard Workersyntax = "proto3"; 16*d5c09012SAndroid Build Coastguard Worker 17*d5c09012SAndroid Build Coastguard Workerpackage google.api.expr.v1alpha1; 18*d5c09012SAndroid Build Coastguard Worker 19*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/duration.proto"; 20*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/struct.proto"; 21*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/timestamp.proto"; 22*d5c09012SAndroid Build Coastguard Worker 23*d5c09012SAndroid Build Coastguard Workeroption cc_enable_arenas = true; 24*d5c09012SAndroid Build Coastguard Workeroption go_package = "google.golang.org/genproto/googleapis/api/expr/v1alpha1;expr"; 25*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true; 26*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "SyntaxProto"; 27*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.api.expr.v1alpha1"; 28*d5c09012SAndroid Build Coastguard Worker 29*d5c09012SAndroid Build Coastguard Worker// A representation of the abstract syntax of the Common Expression Language. 30*d5c09012SAndroid Build Coastguard Worker 31*d5c09012SAndroid Build Coastguard Worker// An expression together with source information as returned by the parser. 32*d5c09012SAndroid Build Coastguard Workermessage ParsedExpr { 33*d5c09012SAndroid Build Coastguard Worker // The parsed expression. 34*d5c09012SAndroid Build Coastguard Worker Expr expr = 2; 35*d5c09012SAndroid Build Coastguard Worker 36*d5c09012SAndroid Build Coastguard Worker // The source info derived from input that generated the parsed `expr`. 37*d5c09012SAndroid Build Coastguard Worker SourceInfo source_info = 3; 38*d5c09012SAndroid Build Coastguard Worker} 39*d5c09012SAndroid Build Coastguard Worker 40*d5c09012SAndroid Build Coastguard Worker// An abstract representation of a common expression. 41*d5c09012SAndroid Build Coastguard Worker// 42*d5c09012SAndroid Build Coastguard Worker// Expressions are abstractly represented as a collection of identifiers, 43*d5c09012SAndroid Build Coastguard Worker// select statements, function calls, literals, and comprehensions. All 44*d5c09012SAndroid Build Coastguard Worker// operators with the exception of the '.' operator are modelled as function 45*d5c09012SAndroid Build Coastguard Worker// calls. This makes it easy to represent new operators into the existing AST. 46*d5c09012SAndroid Build Coastguard Worker// 47*d5c09012SAndroid Build Coastguard Worker// All references within expressions must resolve to a 48*d5c09012SAndroid Build Coastguard Worker// [Decl][google.api.expr.v1alpha1.Decl] provided at type-check for an 49*d5c09012SAndroid Build Coastguard Worker// expression to be valid. A reference may either be a bare identifier `name` or 50*d5c09012SAndroid Build Coastguard Worker// a qualified identifier `google.api.name`. References may either refer to a 51*d5c09012SAndroid Build Coastguard Worker// value or a function declaration. 52*d5c09012SAndroid Build Coastguard Worker// 53*d5c09012SAndroid Build Coastguard Worker// For example, the expression `google.api.name.startsWith('expr')` references 54*d5c09012SAndroid Build Coastguard Worker// the declaration `google.api.name` within a 55*d5c09012SAndroid Build Coastguard Worker// [Expr.Select][google.api.expr.v1alpha1.Expr.Select] expression, and the 56*d5c09012SAndroid Build Coastguard Worker// function declaration `startsWith`. 57*d5c09012SAndroid Build Coastguard Workermessage Expr { 58*d5c09012SAndroid Build Coastguard Worker // An identifier expression. e.g. `request`. 59*d5c09012SAndroid Build Coastguard Worker message Ident { 60*d5c09012SAndroid Build Coastguard Worker // Required. Holds a single, unqualified identifier, possibly preceded by a 61*d5c09012SAndroid Build Coastguard Worker // '.'. 62*d5c09012SAndroid Build Coastguard Worker // 63*d5c09012SAndroid Build Coastguard Worker // Qualified names are represented by the 64*d5c09012SAndroid Build Coastguard Worker // [Expr.Select][google.api.expr.v1alpha1.Expr.Select] expression. 65*d5c09012SAndroid Build Coastguard Worker string name = 1; 66*d5c09012SAndroid Build Coastguard Worker } 67*d5c09012SAndroid Build Coastguard Worker 68*d5c09012SAndroid Build Coastguard Worker // A field selection expression. e.g. `request.auth`. 69*d5c09012SAndroid Build Coastguard Worker message Select { 70*d5c09012SAndroid Build Coastguard Worker // Required. The target of the selection expression. 71*d5c09012SAndroid Build Coastguard Worker // 72*d5c09012SAndroid Build Coastguard Worker // For example, in the select expression `request.auth`, the `request` 73*d5c09012SAndroid Build Coastguard Worker // portion of the expression is the `operand`. 74*d5c09012SAndroid Build Coastguard Worker Expr operand = 1; 75*d5c09012SAndroid Build Coastguard Worker 76*d5c09012SAndroid Build Coastguard Worker // Required. The name of the field to select. 77*d5c09012SAndroid Build Coastguard Worker // 78*d5c09012SAndroid Build Coastguard Worker // For example, in the select expression `request.auth`, the `auth` portion 79*d5c09012SAndroid Build Coastguard Worker // of the expression would be the `field`. 80*d5c09012SAndroid Build Coastguard Worker string field = 2; 81*d5c09012SAndroid Build Coastguard Worker 82*d5c09012SAndroid Build Coastguard Worker // Whether the select is to be interpreted as a field presence test. 83*d5c09012SAndroid Build Coastguard Worker // 84*d5c09012SAndroid Build Coastguard Worker // This results from the macro `has(request.auth)`. 85*d5c09012SAndroid Build Coastguard Worker bool test_only = 3; 86*d5c09012SAndroid Build Coastguard Worker } 87*d5c09012SAndroid Build Coastguard Worker 88*d5c09012SAndroid Build Coastguard Worker // A call expression, including calls to predefined functions and operators. 89*d5c09012SAndroid Build Coastguard Worker // 90*d5c09012SAndroid Build Coastguard Worker // For example, `value == 10`, `size(map_value)`. 91*d5c09012SAndroid Build Coastguard Worker message Call { 92*d5c09012SAndroid Build Coastguard Worker // The target of an method call-style expression. For example, `x` in 93*d5c09012SAndroid Build Coastguard Worker // `x.f()`. 94*d5c09012SAndroid Build Coastguard Worker Expr target = 1; 95*d5c09012SAndroid Build Coastguard Worker 96*d5c09012SAndroid Build Coastguard Worker // Required. The name of the function or method being called. 97*d5c09012SAndroid Build Coastguard Worker string function = 2; 98*d5c09012SAndroid Build Coastguard Worker 99*d5c09012SAndroid Build Coastguard Worker // The arguments. 100*d5c09012SAndroid Build Coastguard Worker repeated Expr args = 3; 101*d5c09012SAndroid Build Coastguard Worker } 102*d5c09012SAndroid Build Coastguard Worker 103*d5c09012SAndroid Build Coastguard Worker // A list creation expression. 104*d5c09012SAndroid Build Coastguard Worker // 105*d5c09012SAndroid Build Coastguard Worker // Lists may either be homogenous, e.g. `[1, 2, 3]`, or heterogeneous, e.g. 106*d5c09012SAndroid Build Coastguard Worker // `dyn([1, 'hello', 2.0])` 107*d5c09012SAndroid Build Coastguard Worker message CreateList { 108*d5c09012SAndroid Build Coastguard Worker // The elements part of the list. 109*d5c09012SAndroid Build Coastguard Worker repeated Expr elements = 1; 110*d5c09012SAndroid Build Coastguard Worker 111*d5c09012SAndroid Build Coastguard Worker // The indices within the elements list which are marked as optional 112*d5c09012SAndroid Build Coastguard Worker // elements. 113*d5c09012SAndroid Build Coastguard Worker // 114*d5c09012SAndroid Build Coastguard Worker // When an optional-typed value is present, the value it contains 115*d5c09012SAndroid Build Coastguard Worker // is included in the list. If the optional-typed value is absent, the list 116*d5c09012SAndroid Build Coastguard Worker // element is omitted from the CreateList result. 117*d5c09012SAndroid Build Coastguard Worker repeated int32 optional_indices = 2; 118*d5c09012SAndroid Build Coastguard Worker } 119*d5c09012SAndroid Build Coastguard Worker 120*d5c09012SAndroid Build Coastguard Worker // A map or message creation expression. 121*d5c09012SAndroid Build Coastguard Worker // 122*d5c09012SAndroid Build Coastguard Worker // Maps are constructed as `{'key_name': 'value'}`. Message construction is 123*d5c09012SAndroid Build Coastguard Worker // similar, but prefixed with a type name and composed of field ids: 124*d5c09012SAndroid Build Coastguard Worker // `types.MyType{field_id: 'value'}`. 125*d5c09012SAndroid Build Coastguard Worker message CreateStruct { 126*d5c09012SAndroid Build Coastguard Worker // Represents an entry. 127*d5c09012SAndroid Build Coastguard Worker message Entry { 128*d5c09012SAndroid Build Coastguard Worker // Required. An id assigned to this node by the parser which is unique 129*d5c09012SAndroid Build Coastguard Worker // in a given expression tree. This is used to associate type 130*d5c09012SAndroid Build Coastguard Worker // information and other attributes to the node. 131*d5c09012SAndroid Build Coastguard Worker int64 id = 1; 132*d5c09012SAndroid Build Coastguard Worker 133*d5c09012SAndroid Build Coastguard Worker // The `Entry` key kinds. 134*d5c09012SAndroid Build Coastguard Worker oneof key_kind { 135*d5c09012SAndroid Build Coastguard Worker // The field key for a message creator statement. 136*d5c09012SAndroid Build Coastguard Worker string field_key = 2; 137*d5c09012SAndroid Build Coastguard Worker 138*d5c09012SAndroid Build Coastguard Worker // The key expression for a map creation statement. 139*d5c09012SAndroid Build Coastguard Worker Expr map_key = 3; 140*d5c09012SAndroid Build Coastguard Worker } 141*d5c09012SAndroid Build Coastguard Worker 142*d5c09012SAndroid Build Coastguard Worker // Required. The value assigned to the key. 143*d5c09012SAndroid Build Coastguard Worker // 144*d5c09012SAndroid Build Coastguard Worker // If the optional_entry field is true, the expression must resolve to an 145*d5c09012SAndroid Build Coastguard Worker // optional-typed value. If the optional value is present, the key will be 146*d5c09012SAndroid Build Coastguard Worker // set; however, if the optional value is absent, the key will be unset. 147*d5c09012SAndroid Build Coastguard Worker Expr value = 4; 148*d5c09012SAndroid Build Coastguard Worker 149*d5c09012SAndroid Build Coastguard Worker // Whether the key-value pair is optional. 150*d5c09012SAndroid Build Coastguard Worker bool optional_entry = 5; 151*d5c09012SAndroid Build Coastguard Worker } 152*d5c09012SAndroid Build Coastguard Worker 153*d5c09012SAndroid Build Coastguard Worker // The type name of the message to be created, empty when creating map 154*d5c09012SAndroid Build Coastguard Worker // literals. 155*d5c09012SAndroid Build Coastguard Worker string message_name = 1; 156*d5c09012SAndroid Build Coastguard Worker 157*d5c09012SAndroid Build Coastguard Worker // The entries in the creation expression. 158*d5c09012SAndroid Build Coastguard Worker repeated Entry entries = 2; 159*d5c09012SAndroid Build Coastguard Worker } 160*d5c09012SAndroid Build Coastguard Worker 161*d5c09012SAndroid Build Coastguard Worker // A comprehension expression applied to a list or map. 162*d5c09012SAndroid Build Coastguard Worker // 163*d5c09012SAndroid Build Coastguard Worker // Comprehensions are not part of the core syntax, but enabled with macros. 164*d5c09012SAndroid Build Coastguard Worker // A macro matches a specific call signature within a parsed AST and replaces 165*d5c09012SAndroid Build Coastguard Worker // the call with an alternate AST block. Macro expansion happens at parse 166*d5c09012SAndroid Build Coastguard Worker // time. 167*d5c09012SAndroid Build Coastguard Worker // 168*d5c09012SAndroid Build Coastguard Worker // The following macros are supported within CEL: 169*d5c09012SAndroid Build Coastguard Worker // 170*d5c09012SAndroid Build Coastguard Worker // Aggregate type macros may be applied to all elements in a list or all keys 171*d5c09012SAndroid Build Coastguard Worker // in a map: 172*d5c09012SAndroid Build Coastguard Worker // 173*d5c09012SAndroid Build Coastguard Worker // * `all`, `exists`, `exists_one` - test a predicate expression against 174*d5c09012SAndroid Build Coastguard Worker // the inputs and return `true` if the predicate is satisfied for all, 175*d5c09012SAndroid Build Coastguard Worker // any, or only one value `list.all(x, x < 10)`. 176*d5c09012SAndroid Build Coastguard Worker // * `filter` - test a predicate expression against the inputs and return 177*d5c09012SAndroid Build Coastguard Worker // the subset of elements which satisfy the predicate: 178*d5c09012SAndroid Build Coastguard Worker // `payments.filter(p, p > 1000)`. 179*d5c09012SAndroid Build Coastguard Worker // * `map` - apply an expression to all elements in the input and return the 180*d5c09012SAndroid Build Coastguard Worker // output aggregate type: `[1, 2, 3].map(i, i * i)`. 181*d5c09012SAndroid Build Coastguard Worker // 182*d5c09012SAndroid Build Coastguard Worker // The `has(m.x)` macro tests whether the property `x` is present in struct 183*d5c09012SAndroid Build Coastguard Worker // `m`. The semantics of this macro depend on the type of `m`. For proto2 184*d5c09012SAndroid Build Coastguard Worker // messages `has(m.x)` is defined as 'defined, but not set`. For proto3, the 185*d5c09012SAndroid Build Coastguard Worker // macro tests whether the property is set to its default. For map and struct 186*d5c09012SAndroid Build Coastguard Worker // types, the macro tests whether the property `x` is defined on `m`. 187*d5c09012SAndroid Build Coastguard Worker message Comprehension { 188*d5c09012SAndroid Build Coastguard Worker // The name of the iteration variable. 189*d5c09012SAndroid Build Coastguard Worker string iter_var = 1; 190*d5c09012SAndroid Build Coastguard Worker 191*d5c09012SAndroid Build Coastguard Worker // The range over which var iterates. 192*d5c09012SAndroid Build Coastguard Worker Expr iter_range = 2; 193*d5c09012SAndroid Build Coastguard Worker 194*d5c09012SAndroid Build Coastguard Worker // The name of the variable used for accumulation of the result. 195*d5c09012SAndroid Build Coastguard Worker string accu_var = 3; 196*d5c09012SAndroid Build Coastguard Worker 197*d5c09012SAndroid Build Coastguard Worker // The initial value of the accumulator. 198*d5c09012SAndroid Build Coastguard Worker Expr accu_init = 4; 199*d5c09012SAndroid Build Coastguard Worker 200*d5c09012SAndroid Build Coastguard Worker // An expression which can contain iter_var and accu_var. 201*d5c09012SAndroid Build Coastguard Worker // 202*d5c09012SAndroid Build Coastguard Worker // Returns false when the result has been computed and may be used as 203*d5c09012SAndroid Build Coastguard Worker // a hint to short-circuit the remainder of the comprehension. 204*d5c09012SAndroid Build Coastguard Worker Expr loop_condition = 5; 205*d5c09012SAndroid Build Coastguard Worker 206*d5c09012SAndroid Build Coastguard Worker // An expression which can contain iter_var and accu_var. 207*d5c09012SAndroid Build Coastguard Worker // 208*d5c09012SAndroid Build Coastguard Worker // Computes the next value of accu_var. 209*d5c09012SAndroid Build Coastguard Worker Expr loop_step = 6; 210*d5c09012SAndroid Build Coastguard Worker 211*d5c09012SAndroid Build Coastguard Worker // An expression which can contain accu_var. 212*d5c09012SAndroid Build Coastguard Worker // 213*d5c09012SAndroid Build Coastguard Worker // Computes the result. 214*d5c09012SAndroid Build Coastguard Worker Expr result = 7; 215*d5c09012SAndroid Build Coastguard Worker } 216*d5c09012SAndroid Build Coastguard Worker 217*d5c09012SAndroid Build Coastguard Worker // Required. An id assigned to this node by the parser which is unique in a 218*d5c09012SAndroid Build Coastguard Worker // given expression tree. This is used to associate type information and other 219*d5c09012SAndroid Build Coastguard Worker // attributes to a node in the parse tree. 220*d5c09012SAndroid Build Coastguard Worker int64 id = 2; 221*d5c09012SAndroid Build Coastguard Worker 222*d5c09012SAndroid Build Coastguard Worker // Required. Variants of expressions. 223*d5c09012SAndroid Build Coastguard Worker oneof expr_kind { 224*d5c09012SAndroid Build Coastguard Worker // A literal expression. 225*d5c09012SAndroid Build Coastguard Worker Constant const_expr = 3; 226*d5c09012SAndroid Build Coastguard Worker 227*d5c09012SAndroid Build Coastguard Worker // An identifier expression. 228*d5c09012SAndroid Build Coastguard Worker Ident ident_expr = 4; 229*d5c09012SAndroid Build Coastguard Worker 230*d5c09012SAndroid Build Coastguard Worker // A field selection expression, e.g. `request.auth`. 231*d5c09012SAndroid Build Coastguard Worker Select select_expr = 5; 232*d5c09012SAndroid Build Coastguard Worker 233*d5c09012SAndroid Build Coastguard Worker // A call expression, including calls to predefined functions and operators. 234*d5c09012SAndroid Build Coastguard Worker Call call_expr = 6; 235*d5c09012SAndroid Build Coastguard Worker 236*d5c09012SAndroid Build Coastguard Worker // A list creation expression. 237*d5c09012SAndroid Build Coastguard Worker CreateList list_expr = 7; 238*d5c09012SAndroid Build Coastguard Worker 239*d5c09012SAndroid Build Coastguard Worker // A map or message creation expression. 240*d5c09012SAndroid Build Coastguard Worker CreateStruct struct_expr = 8; 241*d5c09012SAndroid Build Coastguard Worker 242*d5c09012SAndroid Build Coastguard Worker // A comprehension expression. 243*d5c09012SAndroid Build Coastguard Worker Comprehension comprehension_expr = 9; 244*d5c09012SAndroid Build Coastguard Worker } 245*d5c09012SAndroid Build Coastguard Worker} 246*d5c09012SAndroid Build Coastguard Worker 247*d5c09012SAndroid Build Coastguard Worker// Represents a primitive literal. 248*d5c09012SAndroid Build Coastguard Worker// 249*d5c09012SAndroid Build Coastguard Worker// Named 'Constant' here for backwards compatibility. 250*d5c09012SAndroid Build Coastguard Worker// 251*d5c09012SAndroid Build Coastguard Worker// This is similar as the primitives supported in the well-known type 252*d5c09012SAndroid Build Coastguard Worker// `google.protobuf.Value`, but richer so it can represent CEL's full range of 253*d5c09012SAndroid Build Coastguard Worker// primitives. 254*d5c09012SAndroid Build Coastguard Worker// 255*d5c09012SAndroid Build Coastguard Worker// Lists and structs are not included as constants as these aggregate types may 256*d5c09012SAndroid Build Coastguard Worker// contain [Expr][google.api.expr.v1alpha1.Expr] elements which require 257*d5c09012SAndroid Build Coastguard Worker// evaluation and are thus not constant. 258*d5c09012SAndroid Build Coastguard Worker// 259*d5c09012SAndroid Build Coastguard Worker// Examples of literals include: `"hello"`, `b'bytes'`, `1u`, `4.2`, `-2`, 260*d5c09012SAndroid Build Coastguard Worker// `true`, `null`. 261*d5c09012SAndroid Build Coastguard Workermessage Constant { 262*d5c09012SAndroid Build Coastguard Worker // Required. The valid constant kinds. 263*d5c09012SAndroid Build Coastguard Worker oneof constant_kind { 264*d5c09012SAndroid Build Coastguard Worker // null value. 265*d5c09012SAndroid Build Coastguard Worker google.protobuf.NullValue null_value = 1; 266*d5c09012SAndroid Build Coastguard Worker 267*d5c09012SAndroid Build Coastguard Worker // boolean value. 268*d5c09012SAndroid Build Coastguard Worker bool bool_value = 2; 269*d5c09012SAndroid Build Coastguard Worker 270*d5c09012SAndroid Build Coastguard Worker // int64 value. 271*d5c09012SAndroid Build Coastguard Worker int64 int64_value = 3; 272*d5c09012SAndroid Build Coastguard Worker 273*d5c09012SAndroid Build Coastguard Worker // uint64 value. 274*d5c09012SAndroid Build Coastguard Worker uint64 uint64_value = 4; 275*d5c09012SAndroid Build Coastguard Worker 276*d5c09012SAndroid Build Coastguard Worker // double value. 277*d5c09012SAndroid Build Coastguard Worker double double_value = 5; 278*d5c09012SAndroid Build Coastguard Worker 279*d5c09012SAndroid Build Coastguard Worker // string value. 280*d5c09012SAndroid Build Coastguard Worker string string_value = 6; 281*d5c09012SAndroid Build Coastguard Worker 282*d5c09012SAndroid Build Coastguard Worker // bytes value. 283*d5c09012SAndroid Build Coastguard Worker bytes bytes_value = 7; 284*d5c09012SAndroid Build Coastguard Worker 285*d5c09012SAndroid Build Coastguard Worker // protobuf.Duration value. 286*d5c09012SAndroid Build Coastguard Worker // 287*d5c09012SAndroid Build Coastguard Worker // Deprecated: duration is no longer considered a builtin cel type. 288*d5c09012SAndroid Build Coastguard Worker google.protobuf.Duration duration_value = 8 [deprecated = true]; 289*d5c09012SAndroid Build Coastguard Worker 290*d5c09012SAndroid Build Coastguard Worker // protobuf.Timestamp value. 291*d5c09012SAndroid Build Coastguard Worker // 292*d5c09012SAndroid Build Coastguard Worker // Deprecated: timestamp is no longer considered a builtin cel type. 293*d5c09012SAndroid Build Coastguard Worker google.protobuf.Timestamp timestamp_value = 9 [deprecated = true]; 294*d5c09012SAndroid Build Coastguard Worker } 295*d5c09012SAndroid Build Coastguard Worker} 296*d5c09012SAndroid Build Coastguard Worker 297*d5c09012SAndroid Build Coastguard Worker// Source information collected at parse time. 298*d5c09012SAndroid Build Coastguard Workermessage SourceInfo { 299*d5c09012SAndroid Build Coastguard Worker // An extension that was requested for the source expression. 300*d5c09012SAndroid Build Coastguard Worker message Extension { 301*d5c09012SAndroid Build Coastguard Worker // Version 302*d5c09012SAndroid Build Coastguard Worker message Version { 303*d5c09012SAndroid Build Coastguard Worker // Major version changes indicate different required support level from 304*d5c09012SAndroid Build Coastguard Worker // the required components. 305*d5c09012SAndroid Build Coastguard Worker int64 major = 1; 306*d5c09012SAndroid Build Coastguard Worker 307*d5c09012SAndroid Build Coastguard Worker // Minor version changes must not change the observed behavior from 308*d5c09012SAndroid Build Coastguard Worker // existing implementations, but may be provided informationally. 309*d5c09012SAndroid Build Coastguard Worker int64 minor = 2; 310*d5c09012SAndroid Build Coastguard Worker } 311*d5c09012SAndroid Build Coastguard Worker 312*d5c09012SAndroid Build Coastguard Worker // CEL component specifier. 313*d5c09012SAndroid Build Coastguard Worker enum Component { 314*d5c09012SAndroid Build Coastguard Worker // Unspecified, default. 315*d5c09012SAndroid Build Coastguard Worker COMPONENT_UNSPECIFIED = 0; 316*d5c09012SAndroid Build Coastguard Worker 317*d5c09012SAndroid Build Coastguard Worker // Parser. Converts a CEL string to an AST. 318*d5c09012SAndroid Build Coastguard Worker COMPONENT_PARSER = 1; 319*d5c09012SAndroid Build Coastguard Worker 320*d5c09012SAndroid Build Coastguard Worker // Type checker. Checks that references in an AST are defined and types 321*d5c09012SAndroid Build Coastguard Worker // agree. 322*d5c09012SAndroid Build Coastguard Worker COMPONENT_TYPE_CHECKER = 2; 323*d5c09012SAndroid Build Coastguard Worker 324*d5c09012SAndroid Build Coastguard Worker // Runtime. Evaluates a parsed and optionally checked CEL AST against a 325*d5c09012SAndroid Build Coastguard Worker // context. 326*d5c09012SAndroid Build Coastguard Worker COMPONENT_RUNTIME = 3; 327*d5c09012SAndroid Build Coastguard Worker } 328*d5c09012SAndroid Build Coastguard Worker 329*d5c09012SAndroid Build Coastguard Worker // Identifier for the extension. Example: constant_folding 330*d5c09012SAndroid Build Coastguard Worker string id = 1; 331*d5c09012SAndroid Build Coastguard Worker 332*d5c09012SAndroid Build Coastguard Worker // If set, the listed components must understand the extension for the 333*d5c09012SAndroid Build Coastguard Worker // expression to evaluate correctly. 334*d5c09012SAndroid Build Coastguard Worker // 335*d5c09012SAndroid Build Coastguard Worker // This field has set semantics, repeated values should be deduplicated. 336*d5c09012SAndroid Build Coastguard Worker repeated Component affected_components = 2; 337*d5c09012SAndroid Build Coastguard Worker 338*d5c09012SAndroid Build Coastguard Worker // Version info. May be skipped if it isn't meaningful for the extension. 339*d5c09012SAndroid Build Coastguard Worker // (for example constant_folding might always be v0.0). 340*d5c09012SAndroid Build Coastguard Worker Version version = 3; 341*d5c09012SAndroid Build Coastguard Worker } 342*d5c09012SAndroid Build Coastguard Worker 343*d5c09012SAndroid Build Coastguard Worker // The syntax version of the source, e.g. `cel1`. 344*d5c09012SAndroid Build Coastguard Worker string syntax_version = 1; 345*d5c09012SAndroid Build Coastguard Worker 346*d5c09012SAndroid Build Coastguard Worker // The location name. All position information attached to an expression is 347*d5c09012SAndroid Build Coastguard Worker // relative to this location. 348*d5c09012SAndroid Build Coastguard Worker // 349*d5c09012SAndroid Build Coastguard Worker // The location could be a file, UI element, or similar. For example, 350*d5c09012SAndroid Build Coastguard Worker // `acme/app/AnvilPolicy.cel`. 351*d5c09012SAndroid Build Coastguard Worker string location = 2; 352*d5c09012SAndroid Build Coastguard Worker 353*d5c09012SAndroid Build Coastguard Worker // Monotonically increasing list of code point offsets where newlines 354*d5c09012SAndroid Build Coastguard Worker // `\n` appear. 355*d5c09012SAndroid Build Coastguard Worker // 356*d5c09012SAndroid Build Coastguard Worker // The line number of a given position is the index `i` where for a given 357*d5c09012SAndroid Build Coastguard Worker // `id` the `line_offsets[i] < id_positions[id] < line_offsets[i+1]`. The 358*d5c09012SAndroid Build Coastguard Worker // column may be derivd from `id_positions[id] - line_offsets[i]`. 359*d5c09012SAndroid Build Coastguard Worker repeated int32 line_offsets = 3; 360*d5c09012SAndroid Build Coastguard Worker 361*d5c09012SAndroid Build Coastguard Worker // A map from the parse node id (e.g. `Expr.id`) to the code point offset 362*d5c09012SAndroid Build Coastguard Worker // within the source. 363*d5c09012SAndroid Build Coastguard Worker map<int64, int32> positions = 4; 364*d5c09012SAndroid Build Coastguard Worker 365*d5c09012SAndroid Build Coastguard Worker // A map from the parse node id where a macro replacement was made to the 366*d5c09012SAndroid Build Coastguard Worker // call `Expr` that resulted in a macro expansion. 367*d5c09012SAndroid Build Coastguard Worker // 368*d5c09012SAndroid Build Coastguard Worker // For example, `has(value.field)` is a function call that is replaced by a 369*d5c09012SAndroid Build Coastguard Worker // `test_only` field selection in the AST. Likewise, the call 370*d5c09012SAndroid Build Coastguard Worker // `list.exists(e, e > 10)` translates to a comprehension expression. The key 371*d5c09012SAndroid Build Coastguard Worker // in the map corresponds to the expression id of the expanded macro, and the 372*d5c09012SAndroid Build Coastguard Worker // value is the call `Expr` that was replaced. 373*d5c09012SAndroid Build Coastguard Worker map<int64, Expr> macro_calls = 5; 374*d5c09012SAndroid Build Coastguard Worker 375*d5c09012SAndroid Build Coastguard Worker // A list of tags for extensions that were used while parsing or type checking 376*d5c09012SAndroid Build Coastguard Worker // the source expression. For example, optimizations that require special 377*d5c09012SAndroid Build Coastguard Worker // runtime support may be specified. 378*d5c09012SAndroid Build Coastguard Worker // 379*d5c09012SAndroid Build Coastguard Worker // These are used to check feature support between components in separate 380*d5c09012SAndroid Build Coastguard Worker // implementations. This can be used to either skip redundant work or 381*d5c09012SAndroid Build Coastguard Worker // report an error if the extension is unsupported. 382*d5c09012SAndroid Build Coastguard Worker repeated Extension extensions = 6; 383*d5c09012SAndroid Build Coastguard Worker} 384*d5c09012SAndroid Build Coastguard Worker 385*d5c09012SAndroid Build Coastguard Worker// A specific position in source. 386*d5c09012SAndroid Build Coastguard Workermessage SourcePosition { 387*d5c09012SAndroid Build Coastguard Worker // The soucre location name (e.g. file name). 388*d5c09012SAndroid Build Coastguard Worker string location = 1; 389*d5c09012SAndroid Build Coastguard Worker 390*d5c09012SAndroid Build Coastguard Worker // The UTF-8 code unit offset. 391*d5c09012SAndroid Build Coastguard Worker int32 offset = 2; 392*d5c09012SAndroid Build Coastguard Worker 393*d5c09012SAndroid Build Coastguard Worker // The 1-based index of the starting line in the source text 394*d5c09012SAndroid Build Coastguard Worker // where the issue occurs, or 0 if unknown. 395*d5c09012SAndroid Build Coastguard Worker int32 line = 3; 396*d5c09012SAndroid Build Coastguard Worker 397*d5c09012SAndroid Build Coastguard Worker // The 0-based index of the starting position within the line of source text 398*d5c09012SAndroid Build Coastguard Worker // where the issue occurs. Only meaningful if line is nonzero. 399*d5c09012SAndroid Build Coastguard Worker int32 column = 4; 400*d5c09012SAndroid Build Coastguard Worker} 401