use crate::error::HierConfError;
use facet::Facet;
type FacetAttr = facet::Attr;
#[cfg(not(feature = "mangen"))]
facet::define_attr_grammar! {
ns "hierconf";
crate_path ::hierconf_core::attrs;
pub enum Attr {
AppName(&'static str),
}
}
#[cfg(feature = "mangen")]
facet::define_attr_grammar! {
ns "hierconf";
crate_path ::hierconf_core::attrs;
pub enum Attr {
AppName(&'static str),
Synopsis(&'static str),
Date(&'static str),
TypeName(&'static str),
TypeDoc(&'static str),
}
}
fn extract_attr_value(
attrs: &[FacetAttr],
key_str: &'static str,
) -> Result<&'static str, HierConfError> {
for attr in attrs {
if attr.ns == Some("hierconf") && attr.key == key_str {
if let Some(hierconf_attr) = attr.get_as::<Attr>() {
match hierconf_attr {
Attr::AppName(name) => {
return Ok(*name);
}
#[cfg(feature = "mangen")]
Attr::Synopsis(text) => {
return Ok(*text);
}
#[cfg(feature = "mangen")]
Attr::Date(date) => {
return Ok(*date);
}
#[cfg(feature = "mangen")]
Attr::TypeName(name) => {
return Ok(*name);
}
#[cfg(feature = "mangen")]
Attr::TypeDoc(doc) => {
return Ok(*doc);
}
}
}
if let Some(value) = attr.get_as::<&'static str>() {
return Ok(*value);
}
return Err(HierConfError::AttributeShapeMismatch {
shape: attr.data.shape(),
key: attr.key,
});
}
}
let attr_name = format!("hierconf::{}", key_str);
Err(HierConfError::MissingAttribute(format!(
"{} must be specified via #[facet({}(\"...\"))] attribute",
key_str, attr_name
)))
}
#[cfg(feature = "mangen")]
fn extract_optional_attr_value(
attrs: &[FacetAttr],
key_str: &'static str,
) -> Result<Option<&'static str>, HierConfError> {
match extract_attr_value(attrs, key_str) {
Ok(value) => Ok(Some(value)),
Err(HierConfError::MissingAttribute(_)) => Ok(None),
Err(e) => Err(e),
}
}
pub fn extract_app_name<T>() -> Result<&'static str, HierConfError>
where
T: Facet<'static>,
{
extract_attr_value(T::SHAPE.attributes, "app_name")
}
#[cfg(feature = "mangen")]
pub fn extract_synopsis<T>() -> Result<Option<&'static str>, HierConfError>
where
T: Facet<'static>,
{
extract_optional_attr_value(T::SHAPE.attributes, "synopsis")
}
#[cfg(feature = "mangen")]
pub fn extract_date<T>() -> Result<Option<&'static str>, HierConfError>
where
T: Facet<'static>,
{
extract_optional_attr_value(T::SHAPE.attributes, "date")
}
#[cfg(feature = "mangen")]
pub fn extract_type_name(attrs: &[FacetAttr]) -> Result<Option<&'static str>, HierConfError> {
extract_optional_attr_value(attrs, "type_name")
}
#[cfg(feature = "mangen")]
pub fn extract_type_doc(attrs: &[FacetAttr]) -> Result<Option<&'static str>, HierConfError> {
extract_optional_attr_value(attrs, "type_doc")
}