| 57 | } |
| 58 | |
| 59 | inline absl::Status ProtoMessageFromValue(const Value& value, |
| 60 | google::protobuf::Message& dest_message) { |
| 61 | const auto* dest_descriptor = dest_message.GetDescriptor(); |
| 62 | const google::protobuf::Message* src_message = nullptr; |
| 63 | if (auto legacy_struct_value = |
| 64 | cel::common_internal::AsLegacyStructValue(value); |
| 65 | legacy_struct_value) { |
| 66 | src_message = legacy_struct_value->message_ptr(); |
| 67 | } |
| 68 | if (auto parsed_message_value = value.AsParsedMessage(); |
| 69 | parsed_message_value) { |
| 70 | src_message = cel::to_address(*parsed_message_value); |
| 71 | } |
| 72 | if (src_message != nullptr) { |
| 73 | const auto* src_descriptor = src_message->GetDescriptor(); |
| 74 | if (dest_descriptor == src_descriptor) { |
| 75 | dest_message.CopyFrom(*src_message); |
| 76 | return absl::OkStatus(); |
| 77 | } |
| 78 | if (dest_descriptor->full_name() == src_descriptor->full_name()) { |
| 79 | absl::Cord serialized; |
| 80 | if (!src_message->SerializePartialToCord(&serialized)) { |
| 81 | return absl::UnknownError(absl::StrCat("failed to serialize message: ", |
| 82 | src_descriptor->full_name())); |
| 83 | } |
| 84 | if (!dest_message.ParsePartialFromCord(serialized)) { |
| 85 | return absl::UnknownError(absl::StrCat("failed to parse message: ", |
| 86 | dest_descriptor->full_name())); |
| 87 | } |
| 88 | return absl::OkStatus(); |
| 89 | } |
| 90 | } |
| 91 | return TypeConversionError(value.GetRuntimeType(), |
| 92 | MessageType(dest_descriptor)) |
| 93 | .NativeValue(); |
| 94 | } |
| 95 | |
| 96 | } // namespace cel::extensions |
| 97 | |