use quote::ToTokens;
use tk_syn_macros::handle_unique_nested_meta_values;
use crate::ast::symbol;
use crate::ast::types::{SiguledXcoder, TypeType, XcoderType};
#[derive(Debug)]
pub(crate) struct DefaultXcoder {
pub typ: Option<TypeType>,
pub enc: Option<SiguledXcoder>,
pub dec: Option<XcoderType>,
pub var: Option<syn::LitBool>,
pub errors: Option<syn::Error>,
}
impl From<&syn::MetaList> for DefaultXcoder {
fn from(input: &syn::MetaList) -> Self {
let mut typ: Option<TypeType> = None;
let mut enc: Option<SiguledXcoder> = None;
let mut dec: Option<XcoderType> = None;
let mut var: Option<syn::LitBool> = None;
let mut errors = input.parse_nested_meta(|meta| {
let maybe_typ = typ
.clone()
.map(|typ| typ.to_token_stream().to_string())
.unwrap_or(String::from("not defined"));
handle_unique_nested_meta_values! {
meta;
err!(UnknownDefaultField(meta.path));
4;
enc: symbol::pnm_parse_maybestr_encoder => err!(DuplicateEncoderInDefault(maybe_typ)),
dec: symbol::pnm_parse_maybestr_decoder => err!(DuplicateDecoderInDefault(maybe_typ)),
typ: symbol::pnm_parse_maybestr_type => err!(DuplicateTypeInDefault),
var: symbol::parse_pnm_variable_length => err!(DuplicateVariableLengthInDefault),
}
}).err();
if enc.is_none() && dec.is_none() {
let e = syn::Error::new_spanned(input.clone(), err!(MissingEncDecInDefault));
match errors {
None => errors = Some(e),
Some(ref mut errors) => errors.combine(e),
}
}
if typ.is_none() {
let e = syn::Error::new_spanned(input.clone(), err!(MissingTypeInDefault));
match errors {
None => errors = Some(e),
Some(ref mut errors) => errors.combine(e),
}
}
DefaultXcoder {
typ,
enc,
dec,
var,
errors,
}
}
}