use proc_macro2::TokenStream;
use quote::quote;
use syn::{
Token,
parse::{Parse, ParseStream},
};
#[derive(Debug, Clone)]
pub enum Modifier {
Move,
Ref,
MutRef,
}
impl Parse for Modifier {
fn parse(input: ParseStream) -> syn::Result<Self> {
if input.peek(Token![mut]) && input.peek2(Token![ref]) {
input.parse::<Token![mut]>()?;
input.parse::<Token![ref]>()?;
Ok(Modifier::MutRef)
} else if input.peek(Token![ref]) {
input.parse::<Token![ref]>()?;
Ok(Modifier::Ref)
} else if input.peek(Token![move]) {
input.parse::<Token![move]>()?;
Ok(Modifier::Move)
} else {
Err(input.error("expected one of: `ref`, `mut ref`, `move`"))
}
}
}
impl Into<TokenStream> for Modifier {
fn into(self) -> TokenStream {
TokenStream::from(&self)
}
}
impl From<&Modifier> for TokenStream {
fn from(value: &Modifier) -> Self {
match value {
Modifier::Move => quote!(),
Modifier::Ref => quote!(&),
Modifier::MutRef => quote!(&mut),
}
}
}