use syn::{ItemFn, punctuated::Punctuated, Token, LitStr};
use quote::quote;
use proc_macro2::TokenStream;
#[allow(dead_code)]
pub fn parse_string_list(input: syn::parse::ParseStream) -> syn::Result<Vec<String>> {
let vars = Punctuated::<LitStr, Token![,]>::parse_terminated(input)?;
Ok(vars.into_iter().map(|lit| lit.value()).collect())
}
#[allow(dead_code)]
pub fn wrap_fn_with_auth_check(
input: &ItemFn,
check_type: &str,
check_value: Option<&str>,
) -> TokenStream {
let fn_name = &input.sig.ident;
let fn_inputs = &input.sig.inputs;
let fn_output = &input.sig.output;
let fn_body = &input.block;
let fn_attrs = &input.attrs;
let fn_vis = &input.vis;
let fn_asyncness = &input.sig.asyncness;
let fn_generics = &input.sig.generics;
let check_code = match check_type {
"login" => quote! {
},
"permission" => {
let _perm = check_value.unwrap_or("");
quote! {
}
},
"role" => {
let _role_name = check_value.unwrap_or("");
quote! {
}
},
_ => quote! {},
};
quote! {
#(#fn_attrs)*
#[allow(unused_variables)]
#fn_vis #fn_asyncness fn #fn_name #fn_generics(#fn_inputs) #fn_output {
#check_code
#fn_body
}
}
}
#[allow(dead_code)]
pub fn generate_auth_metadata(check_type: &str, value: Option<&str>) -> TokenStream {
let metadata = if let Some(v) = value {
format!("{}:{}", check_type, v)
} else {
check_type.to_string()
};
quote! {
#[doc(hidden)]
#[cfg_attr(feature = "sa-token-metadata", sa_token_auth_check = #metadata)]
}
}