qubit_value/value_wire/value_wire_payload_v1_seed.rs
1// =============================================================================
2// Copyright (c) 2025 - 2026 Haixing Hu.
3//
4// SPDX-License-Identifier: Apache-2.0
5//
6// Licensed under the Apache License, Version 2.0.
7// =============================================================================
8
9//! Explicit Serde seed for decoding one unversioned V1 payload.
10
11use serde::Deserialize;
12use serde::Deserializer;
13use serde::de::DeserializeSeed;
14
15use super::ValueWirePayloadV1;
16use super::WireShapeOwned;
17
18/// Explicit Serde seed for decoding one unversioned V1 payload.
19///
20/// Use this seed with a decoder that enforces the resource limits appropriate
21/// for the surrounding document. For complete JSON input, prefer the
22/// bounded JSON decode helpers on `ValueWirePayloadV1`.
23///
24/// With the `json` feature, use it when the surrounding protocol owns the
25/// version envelope and its decoder session:
26///
27/// ```rust
28/// # #[cfg(feature = "json")]
29/// # fn main() -> Result<(), Box<dyn std::error::Error>> {
30/// use qubit_budget::json::{JsonDecodeLimits, JsonDecodeSession};
31/// use qubit_json::decode::JsonDecoder;
32/// use qubit_value::ValueWirePayloadV1Seed;
33///
34/// let limits = JsonDecodeLimits::builder().max_input_bytes(256usize).build();
35/// let session = JsonDecodeSession::from_limits(limits);
36/// let mut decoder = JsonDecoder::new(session);
37/// let payload = decoder.decode_seed_utf8(
38/// ValueWirePayloadV1Seed::new(),
39/// br#"{"scalar":{"int32":7}}"#,
40/// )?;
41/// assert_eq!(payload.into_container().data_type(), qubit_datatype::DataType::Int32);
42/// # Ok(())
43/// # }
44/// # #[cfg(not(feature = "json"))]
45/// # fn main() {}
46/// ```
47#[derive(Debug, Clone, Copy, Default)]
48pub struct ValueWirePayloadV1Seed;
49
50impl ValueWirePayloadV1Seed {
51 /// Creates a seed for one unversioned V1 payload.
52 #[must_use = "the seed should be passed to a bounded deserializer"]
53 #[inline(always)]
54 pub const fn new() -> Self {
55 Self
56 }
57}
58
59impl<'de> DeserializeSeed<'de> for ValueWirePayloadV1Seed {
60 type Value = ValueWirePayloadV1;
61
62 /// Deserializes one unversioned V1 shape.
63 #[inline(always)]
64 fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
65 where
66 D: Deserializer<'de>,
67 {
68 Ok(ValueWirePayloadV1::from_decoded(
69 WireShapeOwned::deserialize(deserializer)?.into(),
70 ))
71 }
72}