use tk_syn_macros::create_parser;
use crate::ast::types::*;
use crate::symbol::*;
fn pnm_parse_maybestr<T: syn::parse::Parse>(input: &syn::meta::ParseNestedMeta) -> syn::Result<T> {
match input.value() {
Ok(value) => match value.parse::<syn::LitStr>() {
Ok(litstr) => litstr.parse(),
Err(_) => value.parse(),
},
Err(err) => Err(err),
}
}
fn nv_parse_maybestr<T: syn::parse::Parse>(input: &syn::MetaNameValue) -> syn::Result<T> {
let value_tokens = input.value.to_token_stream();
match syn::parse2::<syn::LitStr>(value_tokens.clone()) {
Ok(litstr) => litstr.parse(),
Err(_) => T::parse.parse2(value_tokens),
}
}
create_parser!(
ENCODER: SiguledXcoder;
pnm_parse_maybestr => syn::meta::ParseNestedMeta
);
create_parser!(
ENCODER: SiguledXcoder;
nv_parse_maybestr => syn::MetaNameValue
);
create_parser!(
ENCODER: XcoderType;
pnm_parse_maybestr_encoder_no_sigil, pnm_parse_maybestr => syn::meta::ParseNestedMeta
);
create_parser!(
DECODER: XcoderType;
pnm_parse_maybestr => syn::meta::ParseNestedMeta
);
create_parser!(
DECODER: XcoderType;
nv_parse_maybestr => syn::MetaNameValue
);
create_parser!(
TYPE: TypeType;
pnm_parse_maybestr => syn::meta::ParseNestedMeta
);
create_parser!(
STREAM: TypeType;
nv_parse_maybestr => syn::MetaNameValue
);
create_parser!(KEY: syn::Lit; pnm);
create_parser!(SENTINEL: syn::Lit; nv);
create_parser!(VARIABLE_LENGTH: syn::LitBool; pnm);
pub(crate) fn parse_pnm_default_value(
input: &syn::meta::ParseNestedMeta,
) -> Option<syn::Result<DefaultValue>> {
if input.path != DEFAULT_VALUE {
return None;
}
Some(match input.value() {
Ok(value) => value.parse::<syn::Expr>().map(DefaultValue::Expr),
Err(_) => Ok(DefaultValue::Call),
})
}
create_parser!(
LATEBIND: LatebindXcoder;
pnm_parse_maybestr => syn::meta::ParseNestedMeta
);
create_parser!(
LATEBIND: LatebindXcoder;
nv_parse_maybestr => syn::MetaNameValue
);