Replace lone caller of deprecated TakeString method PiperOrigin-RevId: 957387598
diff --git a/quiche/common/structured_headers.h b/quiche/common/structured_headers.h index 0d516d0..f79328b 100644 --- a/quiche/common/structured_headers.h +++ b/quiche/common/structured_headers.h
@@ -140,21 +140,6 @@ return *value; } - // Deprecated: Prefer `GetIfString()`, `GetIfToken()`, or - // `GetIfByteSequence()`. - std::string TakeString() && { - struct Visitor { - std::string* operator()(std::monostate&) { return nullptr; } - std::string* operator()(int64_t&) { return nullptr; } - std::string* operator()(double&) { return nullptr; } - std::string* operator()(std::string& value) { return &value; } - std::string* operator()(bool&) { return nullptr; } - }; - std::string* value = std::visit(Visitor(), value_); - QUICHE_CHECK(value); - return std::move(*value); - } - ItemType Type() const { return static_cast<ItemType>(value_.index()); } private:
diff --git a/quiche/web_transport/web_transport_headers.cc b/quiche/web_transport/web_transport_headers.cc index ed99cac..a702352 100644 --- a/quiche/web_transport/web_transport_headers.cc +++ b/quiche/web_transport/web_transport_headers.cc
@@ -34,23 +34,38 @@ using ::quiche::structured_headers::ParameterizedItem; using ::quiche::structured_headers::ParameterizedMember; -absl::Status CheckItemType(const ParameterizedItem& item, - Item::ItemType expected_type) { - if (item.item.Type() != expected_type) { +template <Item::ItemType kExpectedType> +auto* GetItemAsPtr(auto&& item) { + if constexpr (kExpectedType == Item::kIntegerType) { + return item.item.GetIfInteger(); + } else if constexpr (kExpectedType == Item::kStringType) { + return item.item.GetIfString(); + } else { + static_assert(false); + } +} + +template <Item::ItemType kExpectedType> +auto GetItem(auto&& item) -> absl::StatusOr< + std::remove_pointer_t<decltype(GetItemAsPtr<kExpectedType>(item))>> { + auto* ptr = GetItemAsPtr<kExpectedType>(item); + if (!ptr) { return absl::InvalidArgumentError(absl::StrCat( - "Expected all members to be of type ", ItemTypeToString(expected_type), + "Expected all members to be of type ", ItemTypeToString(kExpectedType), ", found ", ItemTypeToString(item.item.Type()), " instead")); } - return absl::OkStatus(); + return std::move(*ptr); } -absl::Status CheckMemberType(const ParameterizedMember& member, - Item::ItemType expected_type) { + +template <Item::ItemType kExpectedType> +auto GetMember(auto&& member) + -> decltype(GetItem<kExpectedType>(member.member[0])) { if (member.member_is_inner_list || member.member.size() != 1) { return absl::InvalidArgumentError(absl::StrCat( - "Expected all members to be of type", ItemTypeToString(expected_type), + "Expected all members to be of type", ItemTypeToString(kExpectedType), ", found a nested list instead")); } - return CheckItemType(member.member[0], expected_type); + return GetItem<kExpectedType>(member.member[0]); } ABSL_CONST_INIT std::array kInitHeaderFields{ @@ -71,8 +86,9 @@ std::vector<std::string> result; result.reserve(parsed->size()); for (ParameterizedMember& member : *parsed) { - QUICHE_RETURN_IF_ERROR(CheckMemberType(member, Item::kStringType)); - result.push_back(std::move(member.member[0].item).TakeString()); + QUICHE_ASSIGN_OR_RETURN(std::string v, + GetMember<Item::kStringType>(member)); + result.push_back(std::move(v)); } return result; } @@ -100,8 +116,7 @@ if (!parsed.has_value()) { return absl::InvalidArgumentError("Failed to parse sf-item"); } - QUICHE_RETURN_IF_ERROR(CheckItemType(*parsed, Item::kStringType)); - return std::move(parsed->item).TakeString(); + return GetItem<Item::kStringType>(*parsed); } absl::StatusOr<std::string> SerializeSubprotocolResponseHeader( @@ -155,8 +170,8 @@ if (field_name_a != field_name_b) { continue; } - QUICHE_RETURN_IF_ERROR(CheckMemberType(field_value, Item::kIntegerType)); - int64_t value = field_value.member[0].item.GetInteger(); + QUICHE_ASSIGN_OR_RETURN(int64_t value, + GetMember<Item::kIntegerType>(field_value)); if (value < 0) { return absl::InvalidArgumentError( absl::StrCat("Received negative value for ", field_name_a));