use crate::resolve::strip_raw;
pub(crate) fn has_path_attr(attrs: &[syn::Attribute]) -> bool {
attrs.iter().any(|attr| attr.path().is_ident("path"))
}
pub(crate) fn is_public(vis: &syn::Visibility) -> bool {
matches!(vis, syn::Visibility::Public(_))
}
pub(crate) fn pub_item_description(item: &syn::Item) -> Option<String> {
match item {
syn::Item::Fn(i) if is_public(&i.vis) => Some(format!("pub fn {}", i.sig.ident)),
syn::Item::Struct(i) if is_public(&i.vis) => Some(format!("pub struct {}", i.ident)),
syn::Item::Enum(i) if is_public(&i.vis) => Some(format!("pub enum {}", i.ident)),
syn::Item::Union(i) if is_public(&i.vis) => Some(format!("pub union {}", i.ident)),
syn::Item::Type(i) if is_public(&i.vis) => Some(format!("pub type {}", i.ident)),
syn::Item::Const(i) if is_public(&i.vis) => Some(format!("pub const {}", i.ident)),
syn::Item::Static(i) if is_public(&i.vis) => Some(format!("pub static {}", i.ident)),
syn::Item::Trait(i) if is_public(&i.vis) => Some(format!("pub trait {}", i.ident)),
syn::Item::TraitAlias(i) if is_public(&i.vis) => {
Some(format!("pub trait {} (alias)", i.ident))
}
syn::Item::Mod(i) if is_public(&i.vis) => Some(format!("pub mod {}", i.ident)),
syn::Item::ExternCrate(i) if is_public(&i.vis) => {
Some(format!("pub extern crate {}", i.ident))
}
syn::Item::Use(i) if is_public(&i.vis) => Some(format!(
"pub use {}{}",
if i.leading_colon.is_some() { "::" } else { "" },
use_tree_desc(&i.tree)
)),
_ => None,
}
}
fn use_tree_desc(tree: &syn::UseTree) -> String {
match tree {
syn::UseTree::Path(p) => {
format!(
"{}::{}",
strip_raw(&p.ident.to_string()),
use_tree_desc(&p.tree)
)
}
syn::UseTree::Name(n) => strip_raw(&n.ident.to_string()),
syn::UseTree::Rename(r) => format!(
"{} as {}",
strip_raw(&r.ident.to_string()),
strip_raw(&r.rename.to_string())
),
syn::UseTree::Glob(_) => "*".to_string(),
syn::UseTree::Group(g) => {
let inner: Vec<String> = g.items.iter().map(use_tree_desc).collect();
format!("{{{}}}", inner.join(", "))
}
}
}