use proc_macro2::Span; | |
use syn::parse::{Error, Parse, ParseStream, Result}; | |
use syn::Token; | |
#[derive(Copy, Clone)] | |
pub struct Args { | |
pub local: bool, | |
} | |
mod kw { | |
syn::custom_keyword!(Send); | |
} | |
impl Parse for Args { | |
fn parse(input: ParseStream) -> Result<Self> { | |
match try_parse(input) { | |
Ok(args) if input.is_empty() => Ok(args), | |
_ => Err(error()), | |
} | |
} | |
} | |
fn try_parse(input: ParseStream) -> Result<Args> { | |
if input.peek(Token![?]) { | |
input.parse::<Token![?]>()?; | |
input.parse::<kw::Send>()?; | |
Ok(Args { local: true }) | |
} else { | |
Ok(Args { local: false }) | |
} | |
} | |
fn error() -> Error { | |
let msg = "expected #[async_trait] or #[async_trait(?Send)]"; | |
Error::new(Span::call_site(), msg) | |
} |