use crate::ir::cfg::conditional_attribute;
pub(super) fn declared_paths(attrs: &[syn::Attribute]) -> Box<[Box<str>]> {
attrs.iter().flat_map(path_overrides).collect()
}
fn path_overrides(attr: &syn::Attribute) -> Vec<Box<str>> {
match (
attr.path().is_ident("path"),
attr.path().is_ident("cfg_attr"),
) {
(true, _) => literal_value(&attr.meta).into_iter().collect(),
(_, true) => conditional_overrides(attr),
_ => Vec::new(),
}
}
fn conditional_overrides(attr: &syn::Attribute) -> Vec<Box<str>> {
let Some((_, applied)) = conditional_attribute(attr) else {
return Vec::new();
};
applied
.iter()
.filter(|meta| meta.path().is_ident("path"))
.filter_map(literal_value)
.collect()
}
fn literal_value(meta: &syn::Meta) -> Option<Box<str>> {
let syn::Meta::NameValue(pair) = meta else {
return None;
};
match &pair.value {
syn::Expr::Lit(syn::ExprLit {
lit: syn::Lit::Str(text),
..
}) => Some(text.value().into_boxed_str()),
_ => None,
}
}