From 704775ed9e053948d3e81a988cc69602e42d4105 Mon Sep 17 00:00:00 2001 From: Justin King Date: Mon, 18 Dec 2023 12:08:51 -0800 Subject: [PATCH] `DurationValue` serialization PiperOrigin-RevId: 591973506 --- common/values/duration_value.cc | 61 ++++++++++++++++++++++++++++ common/values/duration_value.h | 30 ++++++++++++++ common/values/duration_value_test.cc | 23 +++++++++++ 3 files changed, 114 insertions(+) diff --git a/common/values/duration_value.cc b/common/values/duration_value.cc index a7ae4d7ce..d20b00aa6 100644 --- a/common/values/duration_value.cc +++ b/common/values/duration_value.cc @@ -12,10 +12,19 @@ // See the License for the specific language governing permissions and // limitations under the License. +#include #include +#include +#include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "absl/strings/cord.h" +#include "absl/strings/string_view.h" #include "absl/time/time.h" +#include "common/any.h" #include "common/value.h" +#include "internal/serialize.h" +#include "internal/status_macros.h" #include "internal/time.h" namespace cel { @@ -32,8 +41,60 @@ std::string DurationValue::DebugString() const { return DurationDebugString(NativeValue()); } +absl::StatusOr DurationValue::GetSerializedSize() const { + return internal::SerializedDurationSize(NativeValue()); +} + +absl::Status DurationValue::SerializeTo(absl::Cord& value) const { + return internal::SerializeDuration(NativeValue(), value); +} + +absl::StatusOr DurationValue::Serialize() const { + absl::Cord value; + CEL_RETURN_IF_ERROR(SerializeTo(value)); + return value; +} + +absl::StatusOr DurationValue::GetTypeUrl( + absl::string_view prefix) const { + return MakeTypeUrlWithPrefix(prefix, "google.protobuf.Duration"); +} + +absl::StatusOr DurationValue::ConvertToAny( + absl::string_view prefix) const { + CEL_ASSIGN_OR_RETURN(auto value, Serialize()); + CEL_ASSIGN_OR_RETURN(auto type_url, GetTypeUrl(prefix)); + return MakeAny(std::move(type_url), std::move(value)); +} + std::string DurationValueView::DebugString() const { return DurationDebugString(NativeValue()); } +absl::StatusOr DurationValueView::GetSerializedSize() const { + return internal::SerializedDurationSize(NativeValue()); +} + +absl::Status DurationValueView::SerializeTo(absl::Cord& value) const { + return internal::SerializeDuration(NativeValue(), value); +} + +absl::StatusOr DurationValueView::Serialize() const { + absl::Cord value; + CEL_RETURN_IF_ERROR(SerializeTo(value)); + return value; +} + +absl::StatusOr DurationValueView::GetTypeUrl( + absl::string_view prefix) const { + return MakeTypeUrlWithPrefix(prefix, "google.protobuf.Duration"); +} + +absl::StatusOr DurationValueView::ConvertToAny( + absl::string_view prefix) const { + CEL_ASSIGN_OR_RETURN(auto value, Serialize()); + CEL_ASSIGN_OR_RETURN(auto type_url, GetTypeUrl(prefix)); + return MakeAny(std::move(type_url), std::move(value)); +} + } // namespace cel diff --git a/common/values/duration_value.h b/common/values/duration_value.h index b1b0a7dfd..fc9a2b6ff 100644 --- a/common/values/duration_value.h +++ b/common/values/duration_value.h @@ -18,10 +18,16 @@ #ifndef THIRD_PARTY_CEL_CPP_COMMON_VALUES_DURATION_VALUE_H_ #define THIRD_PARTY_CEL_CPP_COMMON_VALUES_DURATION_VALUE_H_ +#include #include #include +#include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "absl/strings/cord.h" +#include "absl/strings/string_view.h" #include "absl/time/time.h" +#include "common/any.h" #include "common/type.h" #include "common/value_kind.h" @@ -54,6 +60,18 @@ class DurationValue final { std::string DebugString() const; + absl::StatusOr GetSerializedSize() const; + + absl::Status SerializeTo(absl::Cord& value) const; + + absl::StatusOr Serialize() const; + + absl::StatusOr GetTypeUrl( + absl::string_view prefix = kTypeGoogleApisComPrefix) const; + + absl::StatusOr ConvertToAny( + absl::string_view prefix = kTypeGoogleApisComPrefix) const; + constexpr absl::Duration NativeValue() const { return value_; } void swap(DurationValue& other) noexcept { @@ -124,6 +142,18 @@ class DurationValueView final { std::string DebugString() const; + absl::StatusOr GetSerializedSize() const; + + absl::Status SerializeTo(absl::Cord& value) const; + + absl::StatusOr Serialize() const; + + absl::StatusOr GetTypeUrl( + absl::string_view prefix = kTypeGoogleApisComPrefix) const; + + absl::StatusOr ConvertToAny( + absl::string_view prefix = kTypeGoogleApisComPrefix) const; + constexpr absl::Duration NativeValue() const { return value_; } void swap(DurationValueView& other) noexcept { diff --git a/common/values/duration_value_test.cc b/common/values/duration_value_test.cc index 83a07a2a6..f5d9837d5 100644 --- a/common/values/duration_value_test.cc +++ b/common/values/duration_value_test.cc @@ -14,8 +14,10 @@ #include +#include "absl/strings/cord.h" #include "absl/time/time.h" #include "absl/types/optional.h" +#include "common/any.h" #include "common/casting.h" #include "common/native_type.h" #include "common/type.h" @@ -27,6 +29,7 @@ namespace { using testing::An; using testing::Ne; +using cel::internal::IsOkAndHolds; TEST(DurationValue, Kind) { EXPECT_EQ(DurationValue().kind(), DurationValue::kKind); @@ -52,6 +55,16 @@ TEST(DurationValue, DebugString) { } } +TEST(DurationValue, GetSerializedSize) { + EXPECT_THAT(DurationValue().GetSerializedSize(), IsOkAndHolds(0)); +} + +TEST(DurationValue, ConvertToAny) { + EXPECT_THAT(DurationValue().ConvertToAny(), + IsOkAndHolds(MakeAny(MakeTypeUrl("google.protobuf.Duration"), + absl::Cord()))); +} + TEST(DurationValue, NativeTypeId) { EXPECT_EQ(NativeTypeId::Of(DurationValue(absl::Seconds(1))), NativeTypeId::For()); @@ -112,6 +125,16 @@ TEST(DurationValueView, DebugString) { } } +TEST(DurationValueView, GetSerializedSize) { + EXPECT_THAT(DurationValueView().GetSerializedSize(), IsOkAndHolds(0)); +} + +TEST(DurationValueView, ConvertToAny) { + EXPECT_THAT(DurationValueView().ConvertToAny(), + IsOkAndHolds(MakeAny(MakeTypeUrl("google.protobuf.Duration"), + absl::Cord()))); +} + TEST(DurationValueView, NativeTypeId) { EXPECT_EQ(NativeTypeId::Of(DurationValueView(absl::Seconds(1))), NativeTypeId::For());