Skip to main content

qubit_metadata/schema/
metadata_schema_builder.rs

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