use espf::context::ParsedNode;
use espf::diag::EspfError;
use espforge_bindings::components::attrs::Issue;
use espforge_bindings::components::generated_elements::gpio as schema;
#[derive(Debug, Clone)]
pub struct GpioEntry {
pub id: String,
pub pin: u8,
pub direction: Option<String>,
}
pub fn lower_gpio(n: &ParsedNode) -> Result<GpioEntry, EspfError> {
let attrs = schema::Attrs::from_node(n).map_err(|issue| {
let (title, message) = describe(n.id, issue);
EspfError::at_node(n, title, message)
})?;
Ok(GpioEntry {
id: n.id.to_string(),
pin: attrs.pin.value,
direction: attrs
.direction
.map(|direction| direction.value.as_str().to_string()),
})
}
fn describe(id: &str, issue: Issue<'_>) -> (&'static str, String) {
match issue {
Issue::Invalid {
attr: "direction",
value,
} => (
"invalid gpio direction",
format!("<gpio id=\"{id}\"> direction=\"{value}\" must be \"output\" or \"input\""),
),
Issue::Missing { attr } | Issue::Invalid { attr, .. } => (
"invalid gpio pin",
format!("<gpio id=\"{id}\"> needs a numeric {attr}=\"...\""),
),
}
}