qubit-metadata 0.7.1

Type-safe metadata model with schemas and composable filters
Documentation
// =============================================================================
//    Copyright (c) 2025 - 2026 Haixing Hu.
//
//    SPDX-License-Identifier: Apache-2.0
//
//    Licensed under the Apache License, Version 2.0.
// =============================================================================
//! Seed decoder for the strict metadata-schema v1 wire envelope.

use serde::de::DeserializeSeed;
use serde::de::Deserializer;

use super::internal::MetadataSchemaWireV1Visitor;
use super::metadata_schema_wire_v1::MetadataSchemaWireV1;

/// Deserializes a schema envelope with a bounded fields seed.
///
/// # Type Parameters
///
/// * `S` - Seed used to decode the schema fields map.
pub(crate) struct MetadataSchemaWireV1Seed<S> {
    /// Seed used to decode the schema fields map.
    fields: S,
}

impl<S> MetadataSchemaWireV1Seed<S> {
    /// Creates a schema-envelope seed.
    ///
    /// # Parameters
    ///
    /// * `fields` - Seed used to decode the schema fields map.
    ///
    /// # Returns
    ///
    /// A seed configured with the supplied fields decoder.
    #[must_use]
    #[inline]
    pub(crate) const fn new(fields: S) -> Self {
        Self { fields }
    }
}

impl<'de, S> DeserializeSeed<'de> for MetadataSchemaWireV1Seed<S>
where
    S: DeserializeSeed<'de>,
{
    /// The decoded schema envelope, with fields produced by `S`.
    type Value = MetadataSchemaWireV1<S::Value>;

    /// Deserializes the strict schema envelope and delegates fields to its
    /// seed.
    ///
    /// # Type Parameters
    ///
    /// * `D` - Deserializer providing the schema envelope.
    ///
    /// # Parameters
    ///
    /// * `deserializer` - Source of the serialized schema envelope.
    ///
    /// # Returns
    ///
    /// The decoded schema envelope, with the fields value produced by `S`.
    ///
    /// # Errors
    ///
    /// Returns the deserializer error when the input is not a valid strict
    /// schema envelope or when decoding its fields fails.
    fn deserialize<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
    where
        D: Deserializer<'de>,
    {
        deserializer.deserialize_struct(
            "MetadataSchemaWireV1",
            &[
                "version",
                "fields",
                "unknown_metadata_field_policy",
                "unknown_filter_field_policy",
            ],
            MetadataSchemaWireV1Visitor {
                fields: Some(self.fields),
            },
        )
    }
}