use syn;
use derive_builder_core::{DeprecationNotes, BuilderPattern, Setter, Initializer, BuilderField,
Block, Bindings};
use options::DefaultExpression;
#[derive(Debug, Clone)]
pub struct FieldOptions {
pub setter_enabled: bool,
pub builder_pattern: BuilderPattern,
pub setter_ident: syn::Ident,
pub setter_visibility: syn::Visibility,
pub default_expression: Option<DefaultExpression>,
pub use_default_struct: bool,
pub field_ident: syn::Ident,
pub field_type: syn::Ty,
pub setter_into: bool,
pub deprecation_notes: DeprecationNotes,
pub attrs: Vec<syn::Attribute>,
pub bindings: Bindings,
}
impl DefaultExpression {
pub fn parse_block(&self, no_std: bool) -> Block {
let expr = match *self {
DefaultExpression::Explicit(ref s) => {
if s.is_empty() {
panic!(r#"Empty default expressions `default=""` are not supported."#);
}
s
},
DefaultExpression::Trait => if no_std {
"::core::default::Default::default()"
} else {
"::std::default::Default::default()"
},
};
expr.parse().expect(&format!("Couldn't parse default expression `{:?}`", self))
}
}
impl FieldOptions {
pub fn as_setter<'a>(&'a self) -> Setter<'a> {
Setter {
enabled: self.setter_enabled,
visibility: &self.setter_visibility,
pattern: self.builder_pattern,
attrs: &self.attrs,
ident: &self.setter_ident,
field_ident: &self.field_ident,
field_type: &self.field_type,
generic_into: self.setter_into,
deprecation_notes: &self.deprecation_notes,
bindings: self.bindings,
}
}
pub fn as_initializer<'a>(&'a self) -> Initializer<'a> {
Initializer {
setter_enabled: self.setter_enabled,
field_ident: &self.field_ident,
builder_pattern: self.builder_pattern,
default_value: self.default_expression
.as_ref()
.map(|x| { x.parse_block(self.bindings.no_std) }),
use_default_struct: self.use_default_struct,
bindings: self.bindings,
}
}
pub fn as_builder_field<'a>(&'a self) -> BuilderField<'a> {
BuilderField {
field_ident: &self.field_ident,
field_type: &self.field_type,
setter_enabled: self.setter_enabled,
setter_visibility: &self.setter_visibility,
attrs: &self.attrs,
bindings: self.bindings,
}
}
}