use syn::meta::ParseNestedMeta;
pub struct Attributes {
pub crate_path: syn::Path,
}
impl Default for Attributes {
fn default() -> Self {
Attributes {
crate_path: syn::parse_str("clickhouse").expect("BUG: crate_path should parse"),
}
}
}
impl TryFrom<&[syn::Attribute]> for Attributes {
type Error = syn::Error;
fn try_from(attrs: &[syn::Attribute]) -> syn::Result<Self> {
for attr in attrs {
if attr.path().is_ident("clickhouse") {
let mut out = Attributes::default();
attr.parse_nested_meta(|meta| parse_nested_meta(meta, &mut out))?;
return Ok(out);
}
}
Ok(Self::default())
}
}
fn parse_nested_meta(meta: ParseNestedMeta<'_>, out: &mut Attributes) -> syn::Result<()> {
if meta.path.is_ident("crate") {
out.crate_path = meta
.value()?
.parse::<syn::LitStr>()?
.parse()?;
} else {
return Err(meta.error("unexpected `#[clickhouse(...)]` argument"));
}
Ok(())
}