use server_less_parse::MethodInfo;
const KNOWN_SERVER_FLAGS: &[&str] = &["skip", "hidden", "name", "group"];
pub(crate) fn has_server_skip(method: &MethodInfo) -> bool {
has_server_flag(method, "skip")
}
pub(crate) fn has_server_hidden(method: &MethodInfo) -> bool {
has_server_flag(method, "hidden")
}
pub(crate) fn validate_server_attrs(method: &MethodInfo) -> syn::Result<()> {
for attr in &method.method.attrs {
if attr.path().is_ident("server") {
attr.parse_nested_meta(|meta| {
if meta.input.peek(syn::Token![=]) {
let _: proc_macro2::TokenStream = meta.value()?.parse()?;
return Ok(());
}
let key = meta
.path
.get_ident()
.map(|i| i.to_string())
.unwrap_or_default();
if !KNOWN_SERVER_FLAGS.iter().any(|&k| k == key) {
let suggestion = crate::did_you_mean(&key, KNOWN_SERVER_FLAGS)
.map(|s| format!(" — did you mean `{s}`?"))
.unwrap_or_default();
return Err(meta.error(format!(
"unknown `#[server]` attribute `{key}`{suggestion}\n\
\n\
Valid attributes: skip, hidden, name, group"
)));
}
Ok(())
})?;
}
}
Ok(())
}
fn has_server_flag(method: &MethodInfo, flag: &str) -> bool {
for attr in &method.method.attrs {
if attr.path().is_ident("server") {
let mut found = false;
let _ = attr.parse_nested_meta(|meta| {
if meta.path.is_ident(flag) {
found = true;
}
if meta.input.peek(syn::Token![=]) {
let _: proc_macro2::TokenStream = meta.value()?.parse()?;
}
Ok(())
});
if found {
return true;
}
}
}
false
}