use std::borrow::Cow;
use crate::datatype::Field;
use super::{Attributes, DataType, Deprecated, Fields, NamedFields, UnnamedFields};
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct Enum {
pub variants: Vec<(Cow<'static, str>, Variant)>,
pub attributes: Attributes,
}
impl From<Enum> for DataType {
fn from(t: Enum) -> Self {
Self::Enum(t)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub struct Variant {
pub skip: bool,
pub docs: Cow<'static, str>,
pub deprecated: Option<Deprecated>,
pub fields: Fields,
pub attributes: Attributes,
}
impl Variant {
pub fn unit() -> Self {
Self {
skip: false,
docs: "".into(),
deprecated: None,
fields: Fields::Unit,
attributes: Attributes::default(),
}
}
pub fn named() -> VariantBuilder<NamedFields> {
VariantBuilder {
v: Self {
skip: false,
docs: "".into(),
deprecated: None,
fields: Fields::Named(NamedFields {
fields: Default::default(),
}),
attributes: Attributes::default(),
},
variant: NamedFields { fields: vec![] },
}
}
pub fn unnamed() -> VariantBuilder<UnnamedFields> {
VariantBuilder {
v: Self {
skip: false,
docs: "".into(),
deprecated: None,
fields: Fields::Unnamed(UnnamedFields {
fields: Default::default(),
}),
attributes: Attributes::default(),
},
variant: UnnamedFields {
fields: Default::default(),
},
}
}
}
#[derive(Debug, Clone)]
pub struct VariantBuilder<V = ()> {
pub(crate) v: Variant,
pub(crate) variant: V,
}
impl<T> VariantBuilder<T> {
pub fn skip(mut self) -> Self {
self.v.skip = true;
self
}
pub fn docs(mut self, docs: Cow<'static, str>) -> Self {
self.v.docs = docs;
self
}
pub fn deprecated(mut self, reason: Deprecated) -> Self {
self.v.deprecated = Some(reason);
self
}
pub fn attributes(mut self, attributes: Attributes) -> Self {
self.v.attributes = attributes;
self
}
pub fn attributes_mut(&mut self, attributes: Attributes) {
self.v.attributes = attributes;
}
}
impl VariantBuilder<UnnamedFields> {
pub fn field(mut self, field: Field) -> Self {
self.variant.fields.push(field);
self
}
pub fn field_mut(mut self, field: Field) -> Self {
self.variant.fields.push(field);
self
}
pub fn build(mut self) -> Variant {
self.v.fields = Fields::Unnamed(self.variant);
self.v
}
}
impl VariantBuilder<NamedFields> {
pub fn field(mut self, name: impl Into<Cow<'static, str>>, field: Field) -> Self {
self.variant.fields.push((name.into(), field));
self
}
pub fn field_mut(mut self, name: impl Into<Cow<'static, str>>, field: Field) -> Self {
self.variant.fields.push((name.into(), field));
self
}
pub fn build(mut self) -> Variant {
self.v.fields = Fields::Named(self.variant);
self.v
}
}
impl From<VariantBuilder<NamedFields>> for Variant {
fn from(val: VariantBuilder<NamedFields>) -> Self {
val.build()
}
}