use crate::*;
pub(crate) mod attributes;
pub(crate) mod config;
pub(crate) mod field;
pub(crate) mod parser;
pub(crate) mod top_level;
macro_rules! meta_value_lit {
($($arg:tt)*) => {
syn::MetaNameValue {
value: syn::Expr::Lit(syn::ExprLit {
lit: syn::Lit::Str($($arg)*),
..
}),
..
}
};
}
macro_rules! panic_site {
($($message:tt)*) => {
return Err(crate::Error::new(
proc_macro2::Span::call_site(),
format!($($message)*),
))
};
}
macro_rules! panic_span {
($span: expr, $($message:tt)*) => {
return Err(crate::Error::new($span, format!($($message)*)))
};
}
pub(crate) use meta_value_lit;
pub(crate) use panic_site;
pub(crate) use panic_span;
pub(crate) fn str_to_tokens<S: AsRef<str>>(s: S, span: Span) -> TokenStream {
let unprefixed = s.as_ref().strip_prefix('\"').unwrap_or_else(|| s.as_ref());
let s = unprefixed.strip_suffix('\"').unwrap_or(unprefixed);
LitStr::new(s, span).to_token_stream()
}
pub(crate) fn option_to_tokens(opt: &Option<TokenStream>) -> TokenStream {
match opt {
None => quote!(::std::option::Option::None),
Some(pref) => {
quote_spanned!(pref.span()=> ::std::option::Option::<::std::string::String>::Some(#pref.to_string()))
}
}
}
pub(crate) trait PanicOnNone {
type Output;
fn err_on_none<S: AsRef<str>>(self, span: Span, message: S) -> Result<Self::Output>;
}
impl<T> PanicOnNone for Option<T> {
type Output = T;
fn err_on_none<S: AsRef<str>>(self, span: Span, message: S) -> Result<T> {
self.ok_or_else(|| Error::new(span, message.as_ref()))
}
}