use syn::{self, Field, Ident, Meta};
use {FromMetaItem, Result};
use options::{Core, DefaultExpression, ForwardAttrs, ParseAttribute, ParseData};
use util::IdentList;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct OuterFrom {
pub ident: Option<Ident>,
pub attrs: Option<Ident>,
pub container: Core,
pub attr_names: IdentList,
pub forward_attrs: Option<ForwardAttrs>,
pub from_ident: bool,
}
impl OuterFrom {
pub fn start(di: &syn::DeriveInput) -> Self {
OuterFrom {
container: Core::start(di),
attrs: Default::default(),
ident: Default::default(),
attr_names: Default::default(),
forward_attrs: Default::default(),
from_ident: Default::default(),
}
}
}
impl ParseAttribute for OuterFrom {
fn parse_nested(&mut self, mi: &Meta) -> Result<()> {
match mi.name().as_ref() {
"attributes" => { self.attr_names = FromMetaItem::from_meta_item(mi)?; Ok(()) }
"forward_attrs" => { self.forward_attrs = FromMetaItem::from_meta_item(mi)?; Ok(()) },
"from_ident" => {
self.container.default = Some(DefaultExpression::Trait);
self.from_ident = true;
Ok(())
}
_ => self.container.parse_nested(mi)
}
}
}
impl ParseData for OuterFrom {
fn parse_field(&mut self, field: &Field) -> Result<()> {
match field.ident.as_ref().map(|v| v.as_ref()) {
Some("ident") => { self.ident = field.ident.clone(); Ok(()) }
Some("attrs") => { self.attrs = field.ident.clone(); Ok(()) }
_ => self.container.parse_field(field)
}
}
}