use crate::datatype::Struct;
use super::{Attributes, DataType, Deprecated};
use std::borrow::Cow;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum Fields {
Unit,
Unnamed(UnnamedFields),
Named(NamedFields),
}
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct Field {
pub optional: bool,
pub deprecated: Option<Deprecated>,
pub docs: Cow<'static, str>,
pub attributes: Attributes,
pub ty: Option<DataType>,
}
impl Field {
pub fn new(ty: DataType) -> Self {
Field {
optional: false,
deprecated: None,
docs: "".into(),
ty: Some(ty),
attributes: Attributes::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct UnnamedFields {
pub fields: Vec<Field>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct NamedFields {
pub fields: Vec<(Cow<'static, str>, Field)>,
}
#[derive(Debug, Clone)]
pub struct StructBuilder<F = ()> {
pub(crate) fields: F,
}
impl StructBuilder<NamedFields> {
pub fn field(mut self, name: impl Into<Cow<'static, str>>, field: Field) -> Self {
self.fields.fields.push((name.into(), field));
self
}
pub fn field_mut(&mut self, name: impl Into<Cow<'static, str>>, field: Field) {
self.fields.fields.push((name.into(), field));
}
pub fn build(self) -> DataType {
DataType::Struct(Struct {
fields: Fields::Named(self.fields),
attributes: Default::default(),
})
}
}
impl StructBuilder<UnnamedFields> {
pub fn field(mut self, field: Field) -> Self {
self.fields.fields.push(field);
self
}
pub fn field_mut(&mut self, field: Field) {
self.fields.fields.push(field);
}
pub fn build(self) -> DataType {
DataType::Struct(Struct {
fields: Fields::Unnamed(self.fields),
attributes: Default::default(),
})
}
}