use crate::prelude::*;
use proc_macro2::TokenStream;
use venial::{ Struct, AttributeValue };
use quote::quote;
pub(crate) fn impl_from_struct(data: Struct) -> Result<TokenStream> {
let name = &data.name;
let mut output = quote!{};
let attrs = data.attributes;
for attr in attrs.into_iter() {
if !check_attr_name(&attr, "from") { continue };
match attr.value {
AttributeValue::Group(_, tokens) => {
let (ty, expr) = parse_attr_arguments(&tokens)?;
output.extend(quote! {
impl ::core::convert::From<#ty> for #name {
fn from(v: #ty) -> Self {
#expr
}
}
});
},
_ => return Err(Error::IncorrectAttribute)
}
}
Ok(output)
}