AttributeTrail reflects current attribute path. It is functionally similar to cel::Attribute, yet intended to have better complexity on attribute path increment operations. TODO(issues/41) Current AttributeTrail implementation is equivalent to cel::Attribute - improve it. Intended to be used in conjunction with cel::Value, describing the attribute value originated from. Empty AttributeTrail denote
| 20 | // Empty AttributeTrail denotes object with attribute path not defined |
| 21 | // or supported. |
| 22 | class AttributeTrail { |
| 23 | public: |
| 24 | AttributeTrail() : attribute_(absl::nullopt) {} |
| 25 | |
| 26 | explicit AttributeTrail(std::string variable_name) |
| 27 | : attribute_(absl::in_place, std::move(variable_name)) {} |
| 28 | |
| 29 | explicit AttributeTrail(cel::Attribute attribute) |
| 30 | : attribute_(std::move(attribute)) {} |
| 31 | |
| 32 | // NOLINTNEXTLINE(google-explicit-constructor) |
| 33 | AttributeTrail(absl::nullopt_t) : AttributeTrail() {} |
| 34 | |
| 35 | AttributeTrail(const AttributeTrail&) = default; |
| 36 | AttributeTrail& operator=(const AttributeTrail&) = default; |
| 37 | AttributeTrail(AttributeTrail&&) = default; |
| 38 | AttributeTrail& operator=(AttributeTrail&&) = default; |
| 39 | |
| 40 | AttributeTrail& operator=(absl::nullopt_t) { |
| 41 | attribute_.reset(); |
| 42 | return *this; |
| 43 | } |
| 44 | |
| 45 | // Creates AttributeTrail with attribute path incremented by "qualifier". |
| 46 | AttributeTrail Step(cel::AttributeQualifier qualifier) const; |
| 47 | |
| 48 | // Creates AttributeTrail with attribute path incremented by "qualifier". |
| 49 | AttributeTrail Step(const std::string* qualifier) const { |
| 50 | return Step(cel::AttributeQualifier::OfString(*qualifier)); |
| 51 | } |
| 52 | |
| 53 | // Returns CelAttribute that corresponds to content of AttributeTrail. |
| 54 | const cel::Attribute& attribute() const { return attribute_.value(); } |
| 55 | |
| 56 | bool empty() const { return !attribute_.has_value(); } |
| 57 | |
| 58 | private: |
| 59 | absl::optional<cel::Attribute> attribute_; |
| 60 | }; |
| 61 | |
| 62 | } // namespace google::api::expr::runtime |
| 63 |