6363namespace cel {
6464namespace {
6565
66- static constexpr std::array<ValueKind, 25 > kValueToKindArray = {
66+ static constexpr std::array kValueToKindArray = {
6767 ValueKind::kError , ValueKind::kBool , ValueKind::kBytes ,
6868 ValueKind::kDouble , ValueKind::kDuration , ValueKind::kError ,
6969 ValueKind::kInt , ValueKind::kList , ValueKind::kList ,
@@ -72,7 +72,7 @@ static constexpr std::array<ValueKind, 25> kValueToKindArray = {
7272 ValueKind::kNull , ValueKind::kOpaque , ValueKind::kString ,
7373 ValueKind::kStruct , ValueKind::kStruct , ValueKind::kStruct ,
7474 ValueKind::kTimestamp , ValueKind::kType , ValueKind::kUint ,
75- ValueKind::kUnknown };
75+ ValueKind::kUnknown , ValueKind:: kInt };
7676
7777static_assert (kValueToKindArray .size() ==
7878 absl::variant_size<common_internal::ValueVariant>(),
@@ -750,17 +750,20 @@ namespace {
750750Value NonNullEnumValue (
751751 absl::Nonnull<const google::protobuf::EnumValueDescriptor*> value) {
752752 ABSL_DCHECK (value != nullptr );
753- return IntValue (value-> number () );
753+ return EnumValue (value);
754754}
755755
756756Value NonNullEnumValue (absl::Nonnull<const google::protobuf::EnumDescriptor*> type,
757757 int32_t number) {
758758 ABSL_DCHECK (type != nullptr );
759- if (type->is_closed ()) {
760- if (ABSL_PREDICT_FALSE (type->FindValueByNumber (number) == nullptr )) {
761- return ErrorValue (absl::InvalidArgumentError (absl::StrCat (
762- " closed enum has no such value: " , type->full_name (), " ." , number)));
763- }
759+ const google::protobuf::EnumValueDescriptor* enum_value =
760+ type->FindValueByNumber (number);
761+ if (type->is_closed () && ABSL_PREDICT_FALSE (enum_value == nullptr )) {
762+ return ErrorValue (absl::InvalidArgumentError (absl::StrCat (
763+ " closed enum has no such value: " , type->full_name (), " ." , number)));
764+ }
765+ if (enum_value != nullptr ) {
766+ return EnumValue (enum_value);
764767 }
765768 return IntValue (number);
766769}
@@ -1943,6 +1946,18 @@ absl::optional<IntValue> Value::AsInt() const {
19431946 alternative != nullptr ) {
19441947 return *alternative;
19451948 }
1949+ if (const auto * alternative = absl::get_if<EnumValue>(&variant_);
1950+ alternative != nullptr ) {
1951+ return IntValue (alternative->NativeValue ());
1952+ }
1953+ return absl::nullopt ;
1954+ }
1955+
1956+ absl::optional<EnumValue> Value::AsEnum () const {
1957+ if (const auto * alternative = absl::get_if<EnumValue>(&variant_);
1958+ alternative != nullptr ) {
1959+ return *alternative;
1960+ }
19461961 return absl::nullopt ;
19471962}
19481963
@@ -2350,18 +2365,31 @@ ErrorValue Value::GetError() && {
23502365 return absl::get<ErrorValue>(std::move (variant_));
23512366}
23522367
2353- IntValue Value::GetInt () const {
2354- ABSL_DCHECK (IsInt ()) << *this ;
2355- return absl::get<IntValue>(variant_);
2356- }
2357-
23582368#ifdef ABSL_HAVE_EXCEPTIONS
23592369#define CEL_VALUE_THROW_BAD_VARIANT_ACCESS () throw absl::bad_variant_access ()
23602370#else
23612371#define CEL_VALUE_THROW_BAD_VARIANT_ACCESS () \
23622372 ABSL_LOG (FATAL) << absl::bad_variant_access().what() /* Crash OK */
23632373#endif
23642374
2375+ IntValue Value::GetInt () const {
2376+ ABSL_DCHECK (IsInt ()) << *this ;
2377+ if (const auto * alternative = absl::get_if<IntValue>(&variant_);
2378+ alternative != nullptr ) {
2379+ return *alternative;
2380+ }
2381+ if (const auto * alternative = absl::get_if<EnumValue>(&variant_);
2382+ alternative != nullptr ) {
2383+ return IntValue (alternative->NativeValue ());
2384+ }
2385+ CEL_VALUE_THROW_BAD_VARIANT_ACCESS ();
2386+ }
2387+
2388+ EnumValue Value::GetEnum () const {
2389+ ABSL_DCHECK (IsEnum ()) << *this ;
2390+ return absl::get<EnumValue>(variant_);
2391+ }
2392+
23652393ListValue Value::GetList () const & {
23662394 ABSL_DCHECK (IsList ()) << *this ;
23672395 if (const auto * alternative =
0 commit comments