1*d5c09012SAndroid Build Coastguard Worker// Copyright 2019 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 Worker 16*d5c09012SAndroid Build Coastguard Workersyntax = "proto3"; 17*d5c09012SAndroid Build Coastguard Worker 18*d5c09012SAndroid Build Coastguard Workerpackage google.api.expr.v1beta1; 19*d5c09012SAndroid Build Coastguard Worker 20*d5c09012SAndroid Build Coastguard Workerimport "google/api/expr/v1beta1/source.proto"; 21*d5c09012SAndroid Build Coastguard Workerimport "google/protobuf/struct.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/v1beta1;expr"; 25*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true; 26*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "ExprProto"; 27*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.api.expr.v1beta1"; 28*d5c09012SAndroid Build Coastguard Worker 29*d5c09012SAndroid Build Coastguard Worker// An expression together with source information as returned by the parser. 30*d5c09012SAndroid Build Coastguard Workermessage ParsedExpr { 31*d5c09012SAndroid Build Coastguard Worker // The parsed expression. 32*d5c09012SAndroid Build Coastguard Worker Expr expr = 2; 33*d5c09012SAndroid Build Coastguard Worker 34*d5c09012SAndroid Build Coastguard Worker // The source info derived from input that generated the parsed `expr`. 35*d5c09012SAndroid Build Coastguard Worker SourceInfo source_info = 3; 36*d5c09012SAndroid Build Coastguard Worker 37*d5c09012SAndroid Build Coastguard Worker // The syntax version of the source, e.g. `cel1`. 38*d5c09012SAndroid Build Coastguard Worker string syntax_version = 4; 39*d5c09012SAndroid Build Coastguard Worker} 40*d5c09012SAndroid Build Coastguard Worker 41*d5c09012SAndroid Build Coastguard Worker// An abstract representation of a common expression. 42*d5c09012SAndroid Build Coastguard Worker// 43*d5c09012SAndroid Build Coastguard Worker// Expressions are abstractly represented as a collection of identifiers, 44*d5c09012SAndroid Build Coastguard Worker// select statements, function calls, literals, and comprehensions. All 45*d5c09012SAndroid Build Coastguard Worker// operators with the exception of the '.' operator are modelled as function 46*d5c09012SAndroid Build Coastguard Worker// calls. This makes it easy to represent new operators into the existing AST. 47*d5c09012SAndroid Build Coastguard Worker// 48*d5c09012SAndroid Build Coastguard Worker// All references within expressions must resolve to a [Decl][google.api.expr.v1beta1.Decl] provided at 49*d5c09012SAndroid Build Coastguard Worker// type-check for an expression to be valid. A reference may either be a bare 50*d5c09012SAndroid Build Coastguard Worker// identifier `name` or a qualified identifier `google.api.name`. References 51*d5c09012SAndroid Build Coastguard Worker// may either refer to a 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 [Expr.Select][google.api.expr.v1beta1.Expr.Select] expression, and 55*d5c09012SAndroid Build Coastguard Worker// the function declaration `startsWith`. 56*d5c09012SAndroid Build Coastguard Workermessage Expr { 57*d5c09012SAndroid Build Coastguard Worker // An identifier expression. e.g. `request`. 58*d5c09012SAndroid Build Coastguard Worker message Ident { 59*d5c09012SAndroid Build Coastguard Worker // Required. Holds a single, unqualified identifier, possibly preceded by a 60*d5c09012SAndroid Build Coastguard Worker // '.'. 61*d5c09012SAndroid Build Coastguard Worker // 62*d5c09012SAndroid Build Coastguard Worker // Qualified names are represented by the [Expr.Select][google.api.expr.v1beta1.Expr.Select] expression. 63*d5c09012SAndroid Build Coastguard Worker string name = 1; 64*d5c09012SAndroid Build Coastguard Worker } 65*d5c09012SAndroid Build Coastguard Worker 66*d5c09012SAndroid Build Coastguard Worker // A field selection expression. e.g. `request.auth`. 67*d5c09012SAndroid Build Coastguard Worker message Select { 68*d5c09012SAndroid Build Coastguard Worker // Required. The target of the selection expression. 69*d5c09012SAndroid Build Coastguard Worker // 70*d5c09012SAndroid Build Coastguard Worker // For example, in the select expression `request.auth`, the `request` 71*d5c09012SAndroid Build Coastguard Worker // portion of the expression is the `operand`. 72*d5c09012SAndroid Build Coastguard Worker Expr operand = 1; 73*d5c09012SAndroid Build Coastguard Worker 74*d5c09012SAndroid Build Coastguard Worker // Required. The name of the field to select. 75*d5c09012SAndroid Build Coastguard Worker // 76*d5c09012SAndroid Build Coastguard Worker // For example, in the select expression `request.auth`, the `auth` portion 77*d5c09012SAndroid Build Coastguard Worker // of the expression would be the `field`. 78*d5c09012SAndroid Build Coastguard Worker string field = 2; 79*d5c09012SAndroid Build Coastguard Worker 80*d5c09012SAndroid Build Coastguard Worker // Whether the select is to be interpreted as a field presence test. 81*d5c09012SAndroid Build Coastguard Worker // 82*d5c09012SAndroid Build Coastguard Worker // This results from the macro `has(request.auth)`. 83*d5c09012SAndroid Build Coastguard Worker bool test_only = 3; 84*d5c09012SAndroid Build Coastguard Worker } 85*d5c09012SAndroid Build Coastguard Worker 86*d5c09012SAndroid Build Coastguard Worker // A call expression, including calls to predefined functions and operators. 87*d5c09012SAndroid Build Coastguard Worker // 88*d5c09012SAndroid Build Coastguard Worker // For example, `value == 10`, `size(map_value)`. 89*d5c09012SAndroid Build Coastguard Worker message Call { 90*d5c09012SAndroid Build Coastguard Worker // The target of an method call-style expression. For example, `x` in 91*d5c09012SAndroid Build Coastguard Worker // `x.f()`. 92*d5c09012SAndroid Build Coastguard Worker Expr target = 1; 93*d5c09012SAndroid Build Coastguard Worker 94*d5c09012SAndroid Build Coastguard Worker // Required. The name of the function or method being called. 95*d5c09012SAndroid Build Coastguard Worker string function = 2; 96*d5c09012SAndroid Build Coastguard Worker 97*d5c09012SAndroid Build Coastguard Worker // The arguments. 98*d5c09012SAndroid Build Coastguard Worker repeated Expr args = 3; 99*d5c09012SAndroid Build Coastguard Worker } 100*d5c09012SAndroid Build Coastguard Worker 101*d5c09012SAndroid Build Coastguard Worker // A list creation expression. 102*d5c09012SAndroid Build Coastguard Worker // 103*d5c09012SAndroid Build Coastguard Worker // Lists may either be homogenous, e.g. `[1, 2, 3]`, or heterogenous, e.g. 104*d5c09012SAndroid Build Coastguard Worker // `dyn([1, 'hello', 2.0])` 105*d5c09012SAndroid Build Coastguard Worker message CreateList { 106*d5c09012SAndroid Build Coastguard Worker // The elements part of the list. 107*d5c09012SAndroid Build Coastguard Worker repeated Expr elements = 1; 108*d5c09012SAndroid Build Coastguard Worker } 109*d5c09012SAndroid Build Coastguard Worker 110*d5c09012SAndroid Build Coastguard Worker // A map or message creation expression. 111*d5c09012SAndroid Build Coastguard Worker // 112*d5c09012SAndroid Build Coastguard Worker // Maps are constructed as `{'key_name': 'value'}`. Message construction is 113*d5c09012SAndroid Build Coastguard Worker // similar, but prefixed with a type name and composed of field ids: 114*d5c09012SAndroid Build Coastguard Worker // `types.MyType{field_id: 'value'}`. 115*d5c09012SAndroid Build Coastguard Worker message CreateStruct { 116*d5c09012SAndroid Build Coastguard Worker // Represents an entry. 117*d5c09012SAndroid Build Coastguard Worker message Entry { 118*d5c09012SAndroid Build Coastguard Worker // Required. An id assigned to this node by the parser which is unique 119*d5c09012SAndroid Build Coastguard Worker // in a given expression tree. This is used to associate type 120*d5c09012SAndroid Build Coastguard Worker // information and other attributes to the node. 121*d5c09012SAndroid Build Coastguard Worker int32 id = 1; 122*d5c09012SAndroid Build Coastguard Worker 123*d5c09012SAndroid Build Coastguard Worker // The `Entry` key kinds. 124*d5c09012SAndroid Build Coastguard Worker oneof key_kind { 125*d5c09012SAndroid Build Coastguard Worker // The field key for a message creator statement. 126*d5c09012SAndroid Build Coastguard Worker string field_key = 2; 127*d5c09012SAndroid Build Coastguard Worker 128*d5c09012SAndroid Build Coastguard Worker // The key expression for a map creation statement. 129*d5c09012SAndroid Build Coastguard Worker Expr map_key = 3; 130*d5c09012SAndroid Build Coastguard Worker } 131*d5c09012SAndroid Build Coastguard Worker 132*d5c09012SAndroid Build Coastguard Worker // Required. The value assigned to the key. 133*d5c09012SAndroid Build Coastguard Worker Expr value = 4; 134*d5c09012SAndroid Build Coastguard Worker } 135*d5c09012SAndroid Build Coastguard Worker 136*d5c09012SAndroid Build Coastguard Worker // The type name of the message to be created, empty when creating map 137*d5c09012SAndroid Build Coastguard Worker // literals. 138*d5c09012SAndroid Build Coastguard Worker string type = 1; 139*d5c09012SAndroid Build Coastguard Worker 140*d5c09012SAndroid Build Coastguard Worker // The entries in the creation expression. 141*d5c09012SAndroid Build Coastguard Worker repeated Entry entries = 2; 142*d5c09012SAndroid Build Coastguard Worker } 143*d5c09012SAndroid Build Coastguard Worker 144*d5c09012SAndroid Build Coastguard Worker // A comprehension expression applied to a list or map. 145*d5c09012SAndroid Build Coastguard Worker // 146*d5c09012SAndroid Build Coastguard Worker // Comprehensions are not part of the core syntax, but enabled with macros. 147*d5c09012SAndroid Build Coastguard Worker // A macro matches a specific call signature within a parsed AST and replaces 148*d5c09012SAndroid Build Coastguard Worker // the call with an alternate AST block. Macro expansion happens at parse 149*d5c09012SAndroid Build Coastguard Worker // time. 150*d5c09012SAndroid Build Coastguard Worker // 151*d5c09012SAndroid Build Coastguard Worker // The following macros are supported within CEL: 152*d5c09012SAndroid Build Coastguard Worker // 153*d5c09012SAndroid Build Coastguard Worker // Aggregate type macros may be applied to all elements in a list or all keys 154*d5c09012SAndroid Build Coastguard Worker // in a map: 155*d5c09012SAndroid Build Coastguard Worker // 156*d5c09012SAndroid Build Coastguard Worker // * `all`, `exists`, `exists_one` - test a predicate expression against 157*d5c09012SAndroid Build Coastguard Worker // the inputs and return `true` if the predicate is satisfied for all, 158*d5c09012SAndroid Build Coastguard Worker // any, or only one value `list.all(x, x < 10)`. 159*d5c09012SAndroid Build Coastguard Worker // * `filter` - test a predicate expression against the inputs and return 160*d5c09012SAndroid Build Coastguard Worker // the subset of elements which satisfy the predicate: 161*d5c09012SAndroid Build Coastguard Worker // `payments.filter(p, p > 1000)`. 162*d5c09012SAndroid Build Coastguard Worker // * `map` - apply an expression to all elements in the input and return the 163*d5c09012SAndroid Build Coastguard Worker // output aggregate type: `[1, 2, 3].map(i, i * i)`. 164*d5c09012SAndroid Build Coastguard Worker // 165*d5c09012SAndroid Build Coastguard Worker // The `has(m.x)` macro tests whether the property `x` is present in struct 166*d5c09012SAndroid Build Coastguard Worker // `m`. The semantics of this macro depend on the type of `m`. For proto2 167*d5c09012SAndroid Build Coastguard Worker // messages `has(m.x)` is defined as 'defined, but not set`. For proto3, the 168*d5c09012SAndroid Build Coastguard Worker // macro tests whether the property is set to its default. For map and struct 169*d5c09012SAndroid Build Coastguard Worker // types, the macro tests whether the property `x` is defined on `m`. 170*d5c09012SAndroid Build Coastguard Worker message Comprehension { 171*d5c09012SAndroid Build Coastguard Worker // The name of the iteration variable. 172*d5c09012SAndroid Build Coastguard Worker string iter_var = 1; 173*d5c09012SAndroid Build Coastguard Worker 174*d5c09012SAndroid Build Coastguard Worker // The range over which var iterates. 175*d5c09012SAndroid Build Coastguard Worker Expr iter_range = 2; 176*d5c09012SAndroid Build Coastguard Worker 177*d5c09012SAndroid Build Coastguard Worker // The name of the variable used for accumulation of the result. 178*d5c09012SAndroid Build Coastguard Worker string accu_var = 3; 179*d5c09012SAndroid Build Coastguard Worker 180*d5c09012SAndroid Build Coastguard Worker // The initial value of the accumulator. 181*d5c09012SAndroid Build Coastguard Worker Expr accu_init = 4; 182*d5c09012SAndroid Build Coastguard Worker 183*d5c09012SAndroid Build Coastguard Worker // An expression which can contain iter_var and accu_var. 184*d5c09012SAndroid Build Coastguard Worker // 185*d5c09012SAndroid Build Coastguard Worker // Returns false when the result has been computed and may be used as 186*d5c09012SAndroid Build Coastguard Worker // a hint to short-circuit the remainder of the comprehension. 187*d5c09012SAndroid Build Coastguard Worker Expr loop_condition = 5; 188*d5c09012SAndroid Build Coastguard Worker 189*d5c09012SAndroid Build Coastguard Worker // An expression which can contain iter_var and accu_var. 190*d5c09012SAndroid Build Coastguard Worker // 191*d5c09012SAndroid Build Coastguard Worker // Computes the next value of accu_var. 192*d5c09012SAndroid Build Coastguard Worker Expr loop_step = 6; 193*d5c09012SAndroid Build Coastguard Worker 194*d5c09012SAndroid Build Coastguard Worker // An expression which can contain accu_var. 195*d5c09012SAndroid Build Coastguard Worker // 196*d5c09012SAndroid Build Coastguard Worker // Computes the result. 197*d5c09012SAndroid Build Coastguard Worker Expr result = 7; 198*d5c09012SAndroid Build Coastguard Worker } 199*d5c09012SAndroid Build Coastguard Worker 200*d5c09012SAndroid Build Coastguard Worker // Required. An id assigned to this node by the parser which is unique in a 201*d5c09012SAndroid Build Coastguard Worker // given expression tree. This is used to associate type information and other 202*d5c09012SAndroid Build Coastguard Worker // attributes to a node in the parse tree. 203*d5c09012SAndroid Build Coastguard Worker int32 id = 2; 204*d5c09012SAndroid Build Coastguard Worker 205*d5c09012SAndroid Build Coastguard Worker // Required. Variants of expressions. 206*d5c09012SAndroid Build Coastguard Worker oneof expr_kind { 207*d5c09012SAndroid Build Coastguard Worker // A literal expression. 208*d5c09012SAndroid Build Coastguard Worker Literal literal_expr = 3; 209*d5c09012SAndroid Build Coastguard Worker 210*d5c09012SAndroid Build Coastguard Worker // An identifier expression. 211*d5c09012SAndroid Build Coastguard Worker Ident ident_expr = 4; 212*d5c09012SAndroid Build Coastguard Worker 213*d5c09012SAndroid Build Coastguard Worker // A field selection expression, e.g. `request.auth`. 214*d5c09012SAndroid Build Coastguard Worker Select select_expr = 5; 215*d5c09012SAndroid Build Coastguard Worker 216*d5c09012SAndroid Build Coastguard Worker // A call expression, including calls to predefined functions and operators. 217*d5c09012SAndroid Build Coastguard Worker Call call_expr = 6; 218*d5c09012SAndroid Build Coastguard Worker 219*d5c09012SAndroid Build Coastguard Worker // A list creation expression. 220*d5c09012SAndroid Build Coastguard Worker CreateList list_expr = 7; 221*d5c09012SAndroid Build Coastguard Worker 222*d5c09012SAndroid Build Coastguard Worker // A map or object creation expression. 223*d5c09012SAndroid Build Coastguard Worker CreateStruct struct_expr = 8; 224*d5c09012SAndroid Build Coastguard Worker 225*d5c09012SAndroid Build Coastguard Worker // A comprehension expression. 226*d5c09012SAndroid Build Coastguard Worker Comprehension comprehension_expr = 9; 227*d5c09012SAndroid Build Coastguard Worker } 228*d5c09012SAndroid Build Coastguard Worker} 229*d5c09012SAndroid Build Coastguard Worker 230*d5c09012SAndroid Build Coastguard Worker// Represents a primitive literal. 231*d5c09012SAndroid Build Coastguard Worker// 232*d5c09012SAndroid Build Coastguard Worker// This is similar to the primitives supported in the well-known type 233*d5c09012SAndroid Build Coastguard Worker// `google.protobuf.Value`, but richer so it can represent CEL's full range of 234*d5c09012SAndroid Build Coastguard Worker// primitives. 235*d5c09012SAndroid Build Coastguard Worker// 236*d5c09012SAndroid Build Coastguard Worker// Lists and structs are not included as constants as these aggregate types may 237*d5c09012SAndroid Build Coastguard Worker// contain [Expr][google.api.expr.v1beta1.Expr] elements which require evaluation and are thus not constant. 238*d5c09012SAndroid Build Coastguard Worker// 239*d5c09012SAndroid Build Coastguard Worker// Examples of literals include: `"hello"`, `b'bytes'`, `1u`, `4.2`, `-2`, 240*d5c09012SAndroid Build Coastguard Worker// `true`, `null`. 241*d5c09012SAndroid Build Coastguard Workermessage Literal { 242*d5c09012SAndroid Build Coastguard Worker // Required. The valid constant kinds. 243*d5c09012SAndroid Build Coastguard Worker oneof constant_kind { 244*d5c09012SAndroid Build Coastguard Worker // null value. 245*d5c09012SAndroid Build Coastguard Worker google.protobuf.NullValue null_value = 1; 246*d5c09012SAndroid Build Coastguard Worker 247*d5c09012SAndroid Build Coastguard Worker // boolean value. 248*d5c09012SAndroid Build Coastguard Worker bool bool_value = 2; 249*d5c09012SAndroid Build Coastguard Worker 250*d5c09012SAndroid Build Coastguard Worker // int64 value. 251*d5c09012SAndroid Build Coastguard Worker int64 int64_value = 3; 252*d5c09012SAndroid Build Coastguard Worker 253*d5c09012SAndroid Build Coastguard Worker // uint64 value. 254*d5c09012SAndroid Build Coastguard Worker uint64 uint64_value = 4; 255*d5c09012SAndroid Build Coastguard Worker 256*d5c09012SAndroid Build Coastguard Worker // double value. 257*d5c09012SAndroid Build Coastguard Worker double double_value = 5; 258*d5c09012SAndroid Build Coastguard Worker 259*d5c09012SAndroid Build Coastguard Worker // string value. 260*d5c09012SAndroid Build Coastguard Worker string string_value = 6; 261*d5c09012SAndroid Build Coastguard Worker 262*d5c09012SAndroid Build Coastguard Worker // bytes value. 263*d5c09012SAndroid Build Coastguard Worker bytes bytes_value = 7; 264*d5c09012SAndroid Build Coastguard Worker } 265*d5c09012SAndroid Build Coastguard Worker} 266