xref: /aosp_15_r20/external/googleapis/google/api/expr/v1alpha1/syntax.proto (revision d5c09012810ac0c9f33fe448fb6da8260d444cc9)
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