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/api/expr/v1alpha1/value.proto"; 20*d5c09012SAndroid Build Coastguard Workerimport "google/rpc/status.proto"; 21*d5c09012SAndroid Build Coastguard Worker 22*d5c09012SAndroid Build Coastguard Workeroption cc_enable_arenas = true; 23*d5c09012SAndroid Build Coastguard Workeroption go_package = "google.golang.org/genproto/googleapis/api/expr/v1alpha1;expr"; 24*d5c09012SAndroid Build Coastguard Workeroption java_multiple_files = true; 25*d5c09012SAndroid Build Coastguard Workeroption java_outer_classname = "EvalProto"; 26*d5c09012SAndroid Build Coastguard Workeroption java_package = "com.google.api.expr.v1alpha1"; 27*d5c09012SAndroid Build Coastguard Worker 28*d5c09012SAndroid Build Coastguard Worker// The state of an evaluation. 29*d5c09012SAndroid Build Coastguard Worker// 30*d5c09012SAndroid Build Coastguard Worker// Can represent an inital, partial, or completed state of evaluation. 31*d5c09012SAndroid Build Coastguard Workermessage EvalState { 32*d5c09012SAndroid Build Coastguard Worker // A single evalution result. 33*d5c09012SAndroid Build Coastguard Worker message Result { 34*d5c09012SAndroid Build Coastguard Worker // The id of the expression this result if for. 35*d5c09012SAndroid Build Coastguard Worker int64 expr = 1; 36*d5c09012SAndroid Build Coastguard Worker 37*d5c09012SAndroid Build Coastguard Worker // The index in `values` of the resulting value. 38*d5c09012SAndroid Build Coastguard Worker int64 value = 2; 39*d5c09012SAndroid Build Coastguard Worker } 40*d5c09012SAndroid Build Coastguard Worker 41*d5c09012SAndroid Build Coastguard Worker // The unique values referenced in this message. 42*d5c09012SAndroid Build Coastguard Worker repeated ExprValue values = 1; 43*d5c09012SAndroid Build Coastguard Worker 44*d5c09012SAndroid Build Coastguard Worker // An ordered list of results. 45*d5c09012SAndroid Build Coastguard Worker // 46*d5c09012SAndroid Build Coastguard Worker // Tracks the flow of evaluation through the expression. 47*d5c09012SAndroid Build Coastguard Worker // May be sparse. 48*d5c09012SAndroid Build Coastguard Worker repeated Result results = 3; 49*d5c09012SAndroid Build Coastguard Worker} 50*d5c09012SAndroid Build Coastguard Worker 51*d5c09012SAndroid Build Coastguard Worker// The value of an evaluated expression. 52*d5c09012SAndroid Build Coastguard Workermessage ExprValue { 53*d5c09012SAndroid Build Coastguard Worker // An expression can resolve to a value, error or unknown. 54*d5c09012SAndroid Build Coastguard Worker oneof kind { 55*d5c09012SAndroid Build Coastguard Worker // A concrete value. 56*d5c09012SAndroid Build Coastguard Worker Value value = 1; 57*d5c09012SAndroid Build Coastguard Worker 58*d5c09012SAndroid Build Coastguard Worker // The set of errors in the critical path of evalution. 59*d5c09012SAndroid Build Coastguard Worker // 60*d5c09012SAndroid Build Coastguard Worker // Only errors in the critical path are included. For example, 61*d5c09012SAndroid Build Coastguard Worker // `(<error1> || true) && <error2>` will only result in `<error2>`, 62*d5c09012SAndroid Build Coastguard Worker // while `<error1> || <error2>` will result in both `<error1>` and 63*d5c09012SAndroid Build Coastguard Worker // `<error2>`. 64*d5c09012SAndroid Build Coastguard Worker // 65*d5c09012SAndroid Build Coastguard Worker // Errors cause by the presence of other errors are not included in the 66*d5c09012SAndroid Build Coastguard Worker // set. For example `<error1>.foo`, `foo(<error1>)`, and `<error1> + 1` will 67*d5c09012SAndroid Build Coastguard Worker // only result in `<error1>`. 68*d5c09012SAndroid Build Coastguard Worker // 69*d5c09012SAndroid Build Coastguard Worker // Multiple errors *might* be included when evaluation could result 70*d5c09012SAndroid Build Coastguard Worker // in different errors. For example `<error1> + <error2>` and 71*d5c09012SAndroid Build Coastguard Worker // `foo(<error1>, <error2>)` may result in `<error1>`, `<error2>` or both. 72*d5c09012SAndroid Build Coastguard Worker // The exact subset of errors included for this case is unspecified and 73*d5c09012SAndroid Build Coastguard Worker // depends on the implementation details of the evaluator. 74*d5c09012SAndroid Build Coastguard Worker ErrorSet error = 2; 75*d5c09012SAndroid Build Coastguard Worker 76*d5c09012SAndroid Build Coastguard Worker // The set of unknowns in the critical path of evaluation. 77*d5c09012SAndroid Build Coastguard Worker // 78*d5c09012SAndroid Build Coastguard Worker // Unknown behaves identically to Error with regards to propagation. 79*d5c09012SAndroid Build Coastguard Worker // Specifically, only unknowns in the critical path are included, unknowns 80*d5c09012SAndroid Build Coastguard Worker // caused by the presence of other unknowns are not included, and multiple 81*d5c09012SAndroid Build Coastguard Worker // unknowns *might* be included included when evaluation could result in 82*d5c09012SAndroid Build Coastguard Worker // different unknowns. For example: 83*d5c09012SAndroid Build Coastguard Worker // 84*d5c09012SAndroid Build Coastguard Worker // (<unknown[1]> || true) && <unknown[2]> -> <unknown[2]> 85*d5c09012SAndroid Build Coastguard Worker // <unknown[1]> || <unknown[2]> -> <unknown[1,2]> 86*d5c09012SAndroid Build Coastguard Worker // <unknown[1]>.foo -> <unknown[1]> 87*d5c09012SAndroid Build Coastguard Worker // foo(<unknown[1]>) -> <unknown[1]> 88*d5c09012SAndroid Build Coastguard Worker // <unknown[1]> + <unknown[2]> -> <unknown[1]> or <unknown[2[> 89*d5c09012SAndroid Build Coastguard Worker // 90*d5c09012SAndroid Build Coastguard Worker // Unknown takes precidence over Error in cases where a `Value` can short 91*d5c09012SAndroid Build Coastguard Worker // circuit the result: 92*d5c09012SAndroid Build Coastguard Worker // 93*d5c09012SAndroid Build Coastguard Worker // <error> || <unknown> -> <unknown> 94*d5c09012SAndroid Build Coastguard Worker // <error> && <unknown> -> <unknown> 95*d5c09012SAndroid Build Coastguard Worker // 96*d5c09012SAndroid Build Coastguard Worker // Errors take precidence in all other cases: 97*d5c09012SAndroid Build Coastguard Worker // 98*d5c09012SAndroid Build Coastguard Worker // <unknown> + <error> -> <error> 99*d5c09012SAndroid Build Coastguard Worker // foo(<unknown>, <error>) -> <error> 100*d5c09012SAndroid Build Coastguard Worker UnknownSet unknown = 3; 101*d5c09012SAndroid Build Coastguard Worker } 102*d5c09012SAndroid Build Coastguard Worker} 103*d5c09012SAndroid Build Coastguard Worker 104*d5c09012SAndroid Build Coastguard Worker// A set of errors. 105*d5c09012SAndroid Build Coastguard Worker// 106*d5c09012SAndroid Build Coastguard Worker// The errors included depend on the context. See `ExprValue.error`. 107*d5c09012SAndroid Build Coastguard Workermessage ErrorSet { 108*d5c09012SAndroid Build Coastguard Worker // The errors in the set. 109*d5c09012SAndroid Build Coastguard Worker repeated google.rpc.Status errors = 1; 110*d5c09012SAndroid Build Coastguard Worker} 111*d5c09012SAndroid Build Coastguard Worker 112*d5c09012SAndroid Build Coastguard Worker// A set of expressions for which the value is unknown. 113*d5c09012SAndroid Build Coastguard Worker// 114*d5c09012SAndroid Build Coastguard Worker// The unknowns included depend on the context. See `ExprValue.unknown`. 115*d5c09012SAndroid Build Coastguard Workermessage UnknownSet { 116*d5c09012SAndroid Build Coastguard Worker // The ids of the expressions with unknown values. 117*d5c09012SAndroid Build Coastguard Worker repeated int64 exprs = 1; 118*d5c09012SAndroid Build Coastguard Worker} 119