Change ParsePriorityFieldValue() return value.

Use std::optional<> instead of homebrew struct with bool.

PiperOrigin-RevId: 495015412
diff --git a/quiche/quic/core/http/quic_receive_control_stream.cc b/quiche/quic/core/http/quic_receive_control_stream.cc
index 87e9bd7..b23fc57 100644
--- a/quiche/quic/core/http/quic_receive_control_stream.cc
+++ b/quiche/quic/core/http/quic_receive_control_stream.cc
@@ -9,6 +9,7 @@
 #include "absl/strings/numbers.h"
 #include "absl/strings/str_split.h"
 #include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
 #include "quiche/quic/core/http/http_constants.h"
 #include "quiche/quic/core/http/http_decoder.h"
 #include "quiche/quic/core/http/quic_spdy_session.h"
@@ -138,10 +139,10 @@
 
   if (GetQuicReloadableFlag(quic_priority_update_structured_headers_parser)) {
     QUIC_RELOADABLE_FLAG_COUNT(quic_priority_update_structured_headers_parser);
-    const ParsePriorityFieldValueResult result =
+    absl::optional<QuicStreamPriority> priority =
         ParsePriorityFieldValue(frame.priority_field_value);
 
-    if (!result.success) {
+    if (!priority.has_value()) {
       stream_delegate()->OnStreamError(
           QUIC_INVALID_PRIORITY_UPDATE,
           "Invalid PRIORITY_UPDATE frame payload.");
@@ -150,7 +151,7 @@
 
     const QuicStreamId stream_id = frame.prioritized_element_id;
     return spdy_session_->OnPriorityUpdateForRequestStream(stream_id,
-                                                           result.priority);
+                                                           *priority);
   }
 
   for (absl::string_view key_value :
diff --git a/quiche/quic/core/quic_stream_priority.cc b/quiche/quic/core/quic_stream_priority.cc
index 9729706..1209258 100644
--- a/quiche/quic/core/quic_stream_priority.cc
+++ b/quiche/quic/core/quic_stream_priority.cc
@@ -38,12 +38,12 @@
   return *priority_field_value;
 }
 
-ParsePriorityFieldValueResult ParsePriorityFieldValue(
+absl::optional<QuicStreamPriority> ParsePriorityFieldValue(
     absl::string_view priority_field_value) {
   absl::optional<quiche::structured_headers::Dictionary> parsed_dictionary =
       quiche::structured_headers::ParseDictionary(priority_field_value);
   if (!parsed_dictionary.has_value()) {
-    return {false, {}};
+    return std::nullopt;
   }
 
   uint8_t urgency = QuicStreamPriority::kDefaultUrgency;
@@ -77,7 +77,7 @@
     }
   }
 
-  return {true, {urgency, incremental}};
+  return QuicStreamPriority{urgency, incremental};
 }
 
 }  // namespace quic
diff --git a/quiche/quic/core/quic_stream_priority.h b/quiche/quic/core/quic_stream_priority.h
index 33f1183..04db767 100644
--- a/quiche/quic/core/quic_stream_priority.h
+++ b/quiche/quic/core/quic_stream_priority.h
@@ -10,6 +10,7 @@
 #include <tuple>
 
 #include "absl/strings/string_view.h"
+#include "absl/types/optional.h"
 #include "quiche/quic/platform/api/quic_export.h"
 
 namespace quic {
@@ -43,15 +44,10 @@
 QUICHE_EXPORT std::string SerializePriorityFieldValue(
     QuicStreamPriority priority);
 
-// Return type of ParsePriorityFieldValue().
-struct QUICHE_EXPORT ParsePriorityFieldValueResult {
-  bool success;
-  QuicStreamPriority priority;
-};
-
 // Parses the Priority Field Value field of a PRIORITY_UPDATE frame.
-QUICHE_EXPORT ParsePriorityFieldValueResult
-ParsePriorityFieldValue(absl::string_view priority_field_value);
+// Returns nullopt on failure.
+QUICHE_EXPORT absl::optional<QuicStreamPriority> ParsePriorityFieldValue(
+    absl::string_view priority_field_value);
 
 }  // namespace quic
 
diff --git a/quiche/quic/core/quic_stream_priority_test.cc b/quiche/quic/core/quic_stream_priority_test.cc
index 1ebbabb..f379a2a 100644
--- a/quiche/quic/core/quic_stream_priority_test.cc
+++ b/quiche/quic/core/quic_stream_priority_test.cc
@@ -47,70 +47,70 @@
 
 TEST(ParsePriorityFieldValueTest, ParsePriorityFieldValue) {
   // Default values
-  ParsePriorityFieldValueResult result = ParsePriorityFieldValue("");
-  EXPECT_TRUE(result.success);
-  EXPECT_EQ(3, result.priority.urgency);
-  EXPECT_FALSE(result.priority.incremental);
+  absl::optional<QuicStreamPriority> result = ParsePriorityFieldValue("");
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(3, result->urgency);
+  EXPECT_FALSE(result->incremental);
 
   result = ParsePriorityFieldValue("i=?1");
-  EXPECT_TRUE(result.success);
-  EXPECT_EQ(3, result.priority.urgency);
-  EXPECT_TRUE(result.priority.incremental);
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(3, result->urgency);
+  EXPECT_TRUE(result->incremental);
 
   result = ParsePriorityFieldValue("u=5");
-  EXPECT_TRUE(result.success);
-  EXPECT_EQ(5, result.priority.urgency);
-  EXPECT_FALSE(result.priority.incremental);
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(5, result->urgency);
+  EXPECT_FALSE(result->incremental);
 
   result = ParsePriorityFieldValue("u=5, i");
-  EXPECT_TRUE(result.success);
-  EXPECT_EQ(5, result.priority.urgency);
-  EXPECT_TRUE(result.priority.incremental);
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(5, result->urgency);
+  EXPECT_TRUE(result->incremental);
 
   result = ParsePriorityFieldValue("i, u=1");
-  EXPECT_TRUE(result.success);
-  EXPECT_EQ(1, result.priority.urgency);
-  EXPECT_TRUE(result.priority.incremental);
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(1, result->urgency);
+  EXPECT_TRUE(result->incremental);
 
   // Duplicate values are allowed.
   result = ParsePriorityFieldValue("u=5, i=?1, i=?0, u=2");
-  EXPECT_TRUE(result.success);
-  EXPECT_EQ(2, result.priority.urgency);
-  EXPECT_FALSE(result.priority.incremental);
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(2, result->urgency);
+  EXPECT_FALSE(result->incremental);
 
   // Unknown parameters MUST be ignored.
   result = ParsePriorityFieldValue("a=42, u=4, i=?0");
-  EXPECT_TRUE(result.success);
-  EXPECT_EQ(4, result.priority.urgency);
-  EXPECT_FALSE(result.priority.incremental);
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(4, result->urgency);
+  EXPECT_FALSE(result->incremental);
 
   // Out-of-range values MUST be ignored.
   result = ParsePriorityFieldValue("u=-2, i");
-  EXPECT_TRUE(result.success);
-  EXPECT_EQ(3, result.priority.urgency);
-  EXPECT_TRUE(result.priority.incremental);
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(3, result->urgency);
+  EXPECT_TRUE(result->incremental);
 
   // Values of unexpected types MUST be ignored.
   result = ParsePriorityFieldValue("u=4.2, i=\"foo\"");
-  EXPECT_TRUE(result.success);
-  EXPECT_EQ(3, result.priority.urgency);
-  EXPECT_FALSE(result.priority.incremental);
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(3, result->urgency);
+  EXPECT_FALSE(result->incremental);
 
   // Values of the right type but different names are ignored.
   result = ParsePriorityFieldValue("a=4, b=?1");
-  EXPECT_TRUE(result.success);
-  EXPECT_EQ(3, result.priority.urgency);
-  EXPECT_FALSE(result.priority.incremental);
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(3, result->urgency);
+  EXPECT_FALSE(result->incremental);
 
   // Cannot be parsed as structured headers.
   result = ParsePriorityFieldValue("000");
-  EXPECT_FALSE(result.success);
+  EXPECT_FALSE(result.has_value());
 
   // Inner list dictionary values are ignored.
   result = ParsePriorityFieldValue("a=(1 2), u=1");
-  EXPECT_TRUE(result.success);
-  EXPECT_EQ(1, result.priority.urgency);
-  EXPECT_FALSE(result.priority.incremental);
+  ASSERT_TRUE(result.has_value());
+  EXPECT_EQ(1, result->urgency);
+  EXPECT_FALSE(result->incremental);
 }
 
 }  // namespace quic::test