qubit-metadata 0.7.2

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.
// =============================================================================
//! [`MetadataField`] — one field definition in a metadata schema.

use qubit_datatype::DataType;
use serde::Deserialize;
use serde::Deserializer;
use serde::Serialize;

/// Definition of one metadata field in a [`crate::MetadataSchema`].
///
/// Its V1 wire representation is an object with exactly the `data_type` and
/// `required` fields. Positional arrays are rejected by deserialization.
///
/// # Examples
///
/// ```
/// use qubit_datatype::DataType;
/// use qubit_metadata::MetadataField;
///
/// let field = MetadataField::new(DataType::String, true);
/// assert!(field.is_required());
/// ```
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct MetadataField {
    /// Runtime data type of this field.
    data_type: DataType,
    /// Whether this field must be present when validating metadata.
    required: bool,
}

impl<'de> Deserialize<'de> for MetadataField {
    /// Deserializes a field definition from its strict object representation.
    ///
    /// # Type Parameters
    ///
    /// * `D` - Deserializer providing the field object.
    ///
    /// # Parameters
    ///
    /// * `deserializer` - Source of the serialized field definition.
    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
    where
        D: Deserializer<'de>,
    {
        let (data_type, required) = super::internal::deserialize_metadata_field(deserializer)?;
        Ok(Self::new(data_type, required))
    }
}

impl MetadataField {
    /// Creates a field definition.
    ///
    /// # Parameters
    ///
    /// * `data_type` - Concrete data type accepted by the field.
    /// * `required` - Whether metadata must provide a concrete value.
    ///
    /// # Returns
    ///
    /// A new field definition.
    #[inline(always)]
    #[must_use = "the constructed metadata field should be used"]
    pub fn new(data_type: DataType, required: bool) -> Self {
        Self { data_type, required }
    }

    /// Returns the runtime data type of this field.
    ///
    /// # Returns
    ///
    /// The declared field data type.
    #[inline(always)]
    #[must_use = "the metadata field type should be inspected"]
    pub fn data_type(&self) -> DataType {
        self.data_type
    }

    /// Returns `true` when this field is required.
    ///
    /// # Returns
    ///
    /// `true` when validation requires a concrete value for this field.
    #[inline(always)]
    #[must_use]
    pub fn is_required(&self) -> bool {
        self.required
    }
}