Simplify some of the framing code.

PiperOrigin-RevId: 680734084
diff --git a/quiche/quic/moqt/moqt_framer.cc b/quiche/quic/moqt/moqt_framer.cc
index e7042e7..f17caf8 100644
--- a/quiche/quic/moqt/moqt_framer.cc
+++ b/quiche/quic/moqt/moqt_framer.cc
@@ -8,6 +8,7 @@
 #include <cstdint>
 #include <cstdlib>
 #include <optional>
+#include <string>
 #include <type_traits>
 #include <utility>
 
@@ -118,88 +119,55 @@
       : list_(list) {}
 
   size_t GetLengthOnWire() {
-    uint64_t num_params = 0;
-    size_t length = 0;
-    if (list_.authorization_info.has_value()) {
-      ++num_params;
-      length +=
-          WireStringParameter(
-              StringParameter(MoqtTrackRequestParameter::kAuthorizationInfo,
-                              *list_.authorization_info))
-              .GetLengthOnWire();
-    }
-    if (list_.delivery_timeout.has_value()) {
-      ++num_params;
-      length += WireIntParameter(
-                    IntParameter(MoqtTrackRequestParameter::kDeliveryTimeout,
-                                 static_cast<uint64_t>(
-                                     list_.delivery_timeout->ToMilliseconds())))
-                    .GetLengthOnWire();
-    }
-    if (list_.max_cache_duration.has_value()) {
-      ++num_params;
-      length +=
-          WireIntParameter(
-              IntParameter(MoqtTrackRequestParameter::kMaxCacheDuration,
-                           static_cast<uint64_t>(
-                               list_.max_cache_duration->ToMilliseconds())))
-              .GetLengthOnWire();
-    }
-    if (list_.object_ack_window.has_value()) {
-      ++num_params;
-      length +=
-          WireIntParameter(
-              IntParameter(MoqtTrackRequestParameter::kOackWindowSize,
-                           static_cast<uint64_t>(
-                               list_.object_ack_window->ToMicroseconds())))
-              .GetLengthOnWire();
-    }
-    length += WireVarInt62(num_params).GetLengthOnWire();
-    return length;
+    auto string_parameters = StringParameters();
+    auto int_parameters = IntParameters();
+    return quiche::ComputeLengthOnWire(
+        WireVarInt62(string_parameters.size() + int_parameters.size()),
+        WireSpan<WireStringParameter>(string_parameters),
+        WireSpan<WireIntParameter>(int_parameters));
   }
   absl::Status SerializeIntoWriter(quiche::QuicheDataWriter& writer) {
-    uint64_t num_params = (list_.authorization_info.has_value() ? 1 : 0) +
-                          (list_.delivery_timeout.has_value() ? 1 : 0) +
-                          (list_.max_cache_duration.has_value() ? 1 : 0) +
-                          (list_.object_ack_window.has_value() ? 1 : 0);
-    if (!writer.WriteVarInt62(num_params)) {
-      return absl::InternalError("Failed to serialize the length prefix");
-    }
-    if (list_.authorization_info.has_value() &&
-        WireStringParameter(
-            StringParameter(MoqtTrackRequestParameter::kAuthorizationInfo,
-                            *list_.authorization_info))
-                .SerializeIntoWriter(writer) != absl::OkStatus()) {
-      return absl::InternalError("Failed to serialize the authorization info");
-    }
-    if (list_.delivery_timeout.has_value() &&
-        WireIntParameter(
-            IntParameter(MoqtTrackRequestParameter::kDeliveryTimeout,
-                         static_cast<uint64_t>(
-                             list_.delivery_timeout->ToMilliseconds())))
-                .SerializeIntoWriter(writer) != absl::OkStatus()) {
-      return absl::InternalError("Failed to serialize the delivery timeout");
-    }
-    if (list_.max_cache_duration.has_value() &&
-        WireIntParameter(
-            IntParameter(MoqtTrackRequestParameter::kMaxCacheDuration,
-                         static_cast<uint64_t>(
-                             list_.max_cache_duration->ToMilliseconds())))
-                .SerializeIntoWriter(writer) != absl::OkStatus()) {
-      return absl::InternalError("Failed to serialize the max cache duration");
-    }
-    if (list_.object_ack_window.has_value() &&
-        WireIntParameter(
-            IntParameter(MoqtTrackRequestParameter::kOackWindowSize,
-                         static_cast<uint64_t>(
-                             list_.object_ack_window->ToMicroseconds())))
-                .SerializeIntoWriter(writer) != absl::OkStatus()) {
-      return absl::InternalError("Failed to serialize the oack window size");
-    }
-    return absl::OkStatus();
+    auto string_parameters = StringParameters();
+    auto int_parameters = IntParameters();
+    return quiche::SerializeIntoWriter(
+        writer, WireVarInt62(string_parameters.size() + int_parameters.size()),
+        WireSpan<WireStringParameter>(string_parameters),
+        WireSpan<WireIntParameter>(int_parameters));
   }
 
  private:
+  absl::InlinedVector<StringParameter, 1> StringParameters() const {
+    absl::InlinedVector<StringParameter, 1> result;
+    if (list_.authorization_info.has_value()) {
+      result.push_back(
+          StringParameter(MoqtTrackRequestParameter::kAuthorizationInfo,
+                          *list_.authorization_info));
+    }
+    return result;
+  }
+  absl::InlinedVector<IntParameter, 3> IntParameters() const {
+    absl::InlinedVector<IntParameter, 3> result;
+    if (list_.delivery_timeout.has_value()) {
+      QUICHE_DCHECK_GE(*list_.delivery_timeout, quic::QuicTimeDelta::Zero());
+      result.push_back(IntParameter(
+          MoqtTrackRequestParameter::kDeliveryTimeout,
+          static_cast<uint64_t>(list_.delivery_timeout->ToMilliseconds())));
+    }
+    if (list_.max_cache_duration.has_value()) {
+      QUICHE_DCHECK_GE(*list_.max_cache_duration, quic::QuicTimeDelta::Zero());
+      result.push_back(IntParameter(
+          MoqtTrackRequestParameter::kMaxCacheDuration,
+          static_cast<uint64_t>(list_.max_cache_duration->ToMilliseconds())));
+    }
+    if (list_.object_ack_window.has_value()) {
+      QUICHE_DCHECK_GE(*list_.object_ack_window, quic::QuicTimeDelta::Zero());
+      result.push_back(IntParameter(
+          MoqtTrackRequestParameter::kOackWindowSize,
+          static_cast<uint64_t>(list_.object_ack_window->ToMicroseconds())));
+    }
+    return result;
+  }
+
   const MoqtSubscribeParameters& list_;
 };
 
@@ -213,30 +181,21 @@
       : name_(name), includes_name_(includes_name) {}
 
   size_t GetLengthOnWire() {
-    const auto tuple = name_.tuple();
-    size_t num_elements = includes_name_ ? (tuple.size() - 1) : tuple.size();
-    size_t length = WireVarInt62(num_elements).GetLengthOnWire();
-    for (const auto& element : tuple) {
-      length += WireStringWithVarInt62Length(element).GetLengthOnWire();
-    }
-    return length;
+    return quiche::ComputeLengthOnWire(
+        WireVarInt62(num_elements()),
+        WireSpan<WireStringWithVarInt62Length, std::string>(name_.tuple()));
   }
   absl::Status SerializeIntoWriter(quiche::QuicheDataWriter& writer) {
-    const auto tuple = name_.tuple();
-    size_t num_elements = includes_name_ ? (tuple.size() - 1) : tuple.size();
-    if (!writer.WriteVarInt62(num_elements)) {
-      return absl::InternalError("Failed to serialize the length prefix");
-    }
-    for (const auto& element : tuple) {
-      if (WireStringWithVarInt62Length(element).SerializeIntoWriter(writer) !=
-          absl::OkStatus()) {
-        return absl::InternalError("Failed to serialize the element");
-      }
-    }
-    return absl::OkStatus();
+    return quiche::SerializeIntoWriter(
+        writer, WireVarInt62(num_elements()),
+        WireSpan<WireStringWithVarInt62Length, std::string>(name_.tuple()));
   }
 
  private:
+  size_t num_elements() const {
+    return includes_name_ ? (name_.tuple().size() - 1) : name_.tuple().size();
+  }
+
   const FullTrackName& name_;
   const bool includes_name_;
 };