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::{
17    MetadataField,
18    MetadataSchema,
19    UnknownFieldPolicy,
20};
21
22/// Builder for [`MetadataSchema`].
23#[derive(Debug, Clone, PartialEq, Eq, Default)]
24pub struct MetadataSchemaBuilder {
25    /// Field definitions being built.
26    fields: BTreeMap<String, MetadataField>,
27    /// Unknown-field policy copied into the built schema.
28    unknown_field_policy: UnknownFieldPolicy,
29}
30
31impl MetadataSchemaBuilder {
32    /// Adds a required field definition.
33    #[inline]
34    #[must_use]
35    pub fn required(mut self, key: &str, data_type: DataType) -> Self {
36        self.fields
37            .insert(key.to_string(), MetadataField::new(data_type, true));
38        self
39    }
40
41    /// Adds an optional field definition.
42    #[inline]
43    #[must_use]
44    pub fn optional(mut self, key: &str, data_type: DataType) -> Self {
45        self.fields
46            .insert(key.to_string(), MetadataField::new(data_type, false));
47        self
48    }
49
50    /// Sets the policy for metadata keys not declared by the schema.
51    #[inline]
52    #[must_use]
53    pub fn unknown_field_policy(mut self, policy: UnknownFieldPolicy) -> Self {
54        self.unknown_field_policy = policy;
55        self
56    }
57
58    /// Builds the schema.
59    #[inline]
60    #[must_use]
61    pub fn build(self) -> MetadataSchema {
62        MetadataSchema::new(self.fields, self.unknown_field_policy)
63    }
64}