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