Skip to main content

qubit_metadata/
metadata_schema_builder.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026.
4 *    Haixing Hu, Qubit Co. Ltd.
5 *
6 *    All rights reserved.
7 *
8 ******************************************************************************/
9//! [`MetadataSchemaBuilder`] — fluent schema construction API.
10
11use std::collections::BTreeMap;
12
13use qubit_common::DataType;
14
15use crate::{MetadataField, MetadataSchema, UnknownFieldPolicy};
16
17/// Builder for [`MetadataSchema`].
18#[derive(Debug, Clone, PartialEq, Eq, Default)]
19pub struct MetadataSchemaBuilder {
20    /// Field definitions being built.
21    fields: BTreeMap<String, MetadataField>,
22    /// Unknown-field policy copied into the built schema.
23    unknown_field_policy: UnknownFieldPolicy,
24}
25
26impl MetadataSchemaBuilder {
27    /// Adds a required field definition.
28    #[inline]
29    #[must_use]
30    pub fn required(mut self, key: &str, data_type: DataType) -> Self {
31        self.fields
32            .insert(key.to_string(), MetadataField::new(data_type, true));
33        self
34    }
35
36    /// Adds an optional field definition.
37    #[inline]
38    #[must_use]
39    pub fn optional(mut self, key: &str, data_type: DataType) -> Self {
40        self.fields
41            .insert(key.to_string(), MetadataField::new(data_type, false));
42        self
43    }
44
45    /// Sets the policy for metadata keys not declared by the schema.
46    #[inline]
47    #[must_use]
48    pub fn unknown_field_policy(mut self, policy: UnknownFieldPolicy) -> Self {
49        self.unknown_field_policy = policy;
50        self
51    }
52
53    /// Builds the schema.
54    #[inline]
55    #[must_use]
56    pub fn build(self) -> MetadataSchema {
57        MetadataSchema::new(self.fields, self.unknown_field_policy)
58    }
59}