use crate::ast::symbol;
use crate::ast::types::{DefaultValue, LatebindXcoder, SiguledXcoder, XcoderType};
use quote::ToTokens;
use tk_syn_macros::handle_unique_nested_meta_values;
#[derive(Debug, Default)]
pub(crate) struct FieldXcoder {
pub key: Option<syn::Lit>,
pub enc: Option<SiguledXcoder>,
pub dec: Option<XcoderType>,
pub varlen: Option<syn::LitBool>,
pub latebind: Option<LatebindXcoder>,
pub errors: Option<syn::Error>,
pub default: Option<DefaultValue>,
pub fallback_enc: bool,
pub fallback_dec: bool,
}
impl From<&syn::MetaList> for FieldXcoder {
fn from(input: &syn::MetaList) -> Self {
let mut key: Option<syn::Lit> = None;
let mut enc: Option<SiguledXcoder> = None;
let mut dec: Option<XcoderType> = None;
let mut varlen: Option<syn::LitBool> = None;
let mut latebind: Option<LatebindXcoder> = None;
let mut default: Option<DefaultValue> = None;
let errors = input
.parse_nested_meta(|meta| {
handle_unique_nested_meta_values! {
meta;
err!(UnknownFieldField(meta.path));
6;
key: symbol::parse_pnm_key => err!(DuplicateKeyInField),
enc: symbol::pnm_parse_maybestr_encoder => err!(DuplicateEncoderInField),
dec: symbol::pnm_parse_maybestr_decoder => err!(DuplicateDecoderInField),
varlen: symbol::parse_pnm_variable_length => err!(DuplicateVariableLengthInField),
latebind: symbol::pnm_parse_maybestr_latebind => err!(DuplicateLatebindInField),
default: symbol::parse_pnm_default_value => err!(DuplicateDefaultInField),
}
})
.err();
FieldXcoder {
key,
enc,
dec,
varlen,
latebind,
errors,
default,
fallback_enc: false,
fallback_dec: false,
}
}
}