2020#include < utility>
2121
2222#include " absl/base/nullability.h"
23- #include " absl/status/status.h"
2423#include " absl/status/statusor.h"
25- #include " absl/strings/str_cat.h"
2624#include " absl/strings/string_view.h"
27- #include " absl/types/optional.h"
2825#include " common/legacy_value.h"
29- #include " common/memory.h"
3026#include " common/type.h"
3127#include " common/type_introspector.h"
3228#include " common/value.h"
29+ #include " common/values/value_builder.h"
3330#include " eval/public/message_wrapper.h"
34- #include " eval/public/structs/legacy_type_adapter.h"
3531#include " eval/public/structs/legacy_type_info_apis.h"
36- #include " eval/public/structs/proto_message_type_adapter.h"
37- #include " extensions/protobuf/memory_manager.h"
3832#include " internal/status_macros.h"
3933#include " google/protobuf/arena.h"
4034#include " google/protobuf/descriptor.h"
@@ -44,61 +38,43 @@ namespace cel::runtime_internal {
4438
4539namespace {
4640
47- using google::api::expr::runtime::LegacyTypeAdapter;
4841using google::api::expr::runtime::LegacyTypeInfoApis;
4942using google::api::expr::runtime::MessageWrapper;
5043
5144class LegacyValueBuilder final : public cel::ValueBuilder {
5245 public:
53- LegacyValueBuilder (cel::MemoryManagerRef memory_manager,
54- LegacyTypeAdapter adapter, MessageWrapper::Builder builder)
55- : memory_manager_(memory_manager),
56- adapter_ (adapter),
57- builder_(std::move(builder)) {}
46+ LegacyValueBuilder (google::protobuf::Arena* absl_nonnull arena,
47+ cel::ValueBuilderPtr builder)
48+ : arena_(arena), builder_(std::move(builder)) {}
5849
59- absl::StatusOr<absl ::optional<cel::ErrorValue>> SetFieldByName (
50+ absl::StatusOr<std ::optional<cel::ErrorValue>> SetFieldByName (
6051 absl::string_view name, cel::Value value) override {
61- CEL_ASSIGN_OR_RETURN (
62- auto legacy_value,
63- LegacyValue (cel::extensions::ProtoMemoryManagerArena (memory_manager_),
64- value),
65- _.With (cel::ErrorValueReturn ()));
66- CEL_RETURN_IF_ERROR (adapter_.mutation_apis ()->SetField (
67- name, legacy_value, memory_manager_, builder_))
68- .With (cel::ErrorValueReturn ());
69- return std::nullopt ;
52+ return builder_->SetFieldByName (name, std::move (value));
7053 }
7154
72- absl::StatusOr<absl ::optional<cel::ErrorValue>> SetFieldByNumber (
55+ absl::StatusOr<std ::optional<cel::ErrorValue>> SetFieldByNumber (
7356 int64_t number, cel::Value value) override {
74- CEL_ASSIGN_OR_RETURN (
75- auto legacy_value,
76- LegacyValue (cel::extensions::ProtoMemoryManagerArena (memory_manager_),
77- value),
78- _.With (cel::ErrorValueReturn ()));
79- CEL_RETURN_IF_ERROR (adapter_.mutation_apis ()->SetFieldByNumber (
80- number, legacy_value, memory_manager_, builder_))
81- .With (cel::ErrorValueReturn ());
82- return std::nullopt ;
57+ return builder_->SetFieldByNumber (number, std::move (value));
8358 }
8459
8560 absl::StatusOr<cel::Value> Build () && override {
86- CEL_ASSIGN_OR_RETURN (auto value,
87- adapter_.mutation_apis ()->AdaptFromWellKnownType (
88- memory_manager_, std::move (builder_)),
61+ CEL_ASSIGN_OR_RETURN (auto value, std::move (*builder_).Build (),
8962 _.With (cel::ErrorValueReturn ()));
90- CEL_ASSIGN_OR_RETURN (
91- auto result,
92- cel::ModernValue (
93- cel::extensions::ProtoMemoryManagerArena (memory_manager_), value),
94- _.With (cel::ErrorValueReturn ()));
95- return result;
63+ if (value.Is <MessageValue>()) {
64+ // Make the value behave like a legacy message. Minimizes further
65+ // legacy/modern conversions (e.g. on return and when accessing fields).
66+ CEL_ASSIGN_OR_RETURN (auto legacy_value, LegacyValue (arena_, value),
67+ _.With (cel::ErrorValueReturn ()));
68+ CEL_ASSIGN_OR_RETURN (auto result, ModernValue (arena_, legacy_value),
69+ _.With (cel::ErrorValueReturn ()));
70+ return result;
71+ }
72+ return value;
9673 }
9774
9875 private:
99- cel::MemoryManagerRef memory_manager_;
100- LegacyTypeAdapter adapter_;
101- MessageWrapper::Builder builder_;
76+ google::protobuf::Arena* const arena_;
77+ cel::ValueBuilderPtr builder_;
10278};
10379
10480} // namespace
@@ -108,26 +84,12 @@ LegacyRuntimeTypeProvider::NewValueBuilder(
10884 absl::string_view name,
10985 google::protobuf::MessageFactory* absl_nonnull message_factory,
11086 google::protobuf::Arena* absl_nonnull arena) const {
111- auto type_adapter = ProvideLegacyType (name);
112-
113- if (!type_adapter. has_value () ) {
87+ auto builder = common_internal::NewValueBuilder (arena, descriptor_pool_,
88+ message_factory, name);
89+ if (builder == nullptr ) {
11490 return nullptr ;
11591 }
116-
117- // We know the implementation should not do this, but can't prove it to type
118- // system.
119- // Defensive checks but impractical to exercise.
120- const auto * mutation_apis = type_adapter->mutation_apis ();
121- if (mutation_apis == nullptr ) {
122- return absl::FailedPreconditionError (
123- absl::StrCat (" LegacyTypeMutationApis missing for type: " , name));
124- }
125-
126- CEL_ASSIGN_OR_RETURN (
127- auto builder,
128- mutation_apis->NewInstance (cel::MemoryManagerRef::Pooling (arena)));
129- return std::make_unique<LegacyValueBuilder>(
130- cel::MemoryManagerRef::Pooling (arena), *type_adapter, std::move (builder));
92+ return std::make_unique<LegacyValueBuilder>(arena, std::move (builder));
13193}
13294
13395absl::StatusOr<std::optional<Type>> LegacyRuntimeTypeProvider::FindTypeImpl (
@@ -175,12 +137,7 @@ LegacyRuntimeTypeProvider::FindStructTypeFieldByNameImpl(
175137 field_desc->name , field_desc->number , cel::DynType{});
176138 }
177139
178- const auto * mutation_apis = (*type_info)->GetMutationApis (MessageWrapper ());
179- if (mutation_apis == nullptr || !mutation_apis->DefinesField (name)) {
180- return std::nullopt ;
181- }
182-
183- return cel::common_internal::BasicStructTypeField (name, 0 , cel::DynType{});
140+ return std::nullopt ;
184141}
185142
186143} // namespace cel::runtime_internal
0 commit comments