use std::collections::BTreeMap;
use qubit_datatype::DataType;
use crate::MetadataError;
use crate::MetadataResult;
use crate::schema::MetadataField;
use crate::schema::MetadataSchema;
use crate::schema::UnknownFilterFieldPolicy;
use crate::schema::UnknownMetadataFieldPolicy;
#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct MetadataSchemaBuilder {
fields: BTreeMap<String, MetadataField>,
unknown_metadata_field_policy: UnknownMetadataFieldPolicy,
unknown_filter_field_policy: UnknownFilterFieldPolicy,
error: Option<MetadataError>,
}
impl MetadataSchemaBuilder {
#[inline]
#[must_use]
pub fn required(self, key: &str, data_type: DataType) -> Self {
self.declare_field(key, MetadataField::new(data_type, true))
}
#[inline]
#[must_use]
pub fn optional(self, key: &str, data_type: DataType) -> Self {
self.declare_field(key, MetadataField::new(data_type, false))
}
#[inline]
#[must_use]
pub fn replace_field(mut self, key: &str, field: MetadataField) -> Self {
let _ = self.fields.insert(key.to_string(), field);
self
}
#[inline]
#[must_use]
pub fn unknown_metadata_field_policy(mut self, policy: UnknownMetadataFieldPolicy) -> Self {
self.unknown_metadata_field_policy = policy;
self
}
#[inline]
#[must_use]
pub fn unknown_filter_field_policy(mut self, policy: UnknownFilterFieldPolicy) -> Self {
self.unknown_filter_field_policy = policy;
self
}
#[inline]
pub fn build(self) -> MetadataResult<MetadataSchema> {
if let Some(error) = self.error {
return Err(error);
}
Ok(MetadataSchema::new(
self.fields,
self.unknown_metadata_field_policy,
self.unknown_filter_field_policy,
))
}
fn declare_field(mut self, key: &str, field: MetadataField) -> Self {
if self.fields.contains_key(key) {
if self.error.is_none() {
self.error = Some(MetadataError::DuplicateSchemaField { key: key.to_string() });
}
return self;
}
let _ = self.fields.insert(key.to_string(), field);
self
}
}