beuvy 0.1.0

Facade crate for beuvy-runtime plus optional declarative UI authoring.
Documentation
use crate::ast::{DeclarativeTextKind, DeclarativeUiNode};
use crate::error::DeclarativeUiAssetLoadError;
use crate::parser::{
    DeclarativeStateSpec, attr, parse_class_bindings, parse_conditional, parse_ref_binding,
    parse_show_attr, parse_state_visual_styles, parse_text_content, parse_text_style,
    parse_visual_style, reject_style_attrs,
};
use roxmltree::Node as XmlNode;
use std::collections::BTreeMap;

pub(crate) fn parse_declarative_text_node(
    node: XmlNode<'_, '_>,
    tag: &str,
    state_specs: &BTreeMap<String, DeclarativeStateSpec>,
) -> Result<DeclarativeUiNode, DeclarativeUiAssetLoadError> {
    reject_style_attrs(node)?;
    let mut style = parse_text_style(node, tag)?;
    style.visual_style = parse_visual_style(node)?;
    style.state_visual_styles = parse_state_visual_styles(node)?;
    Ok(DeclarativeUiNode::Text {
        node_id: String::new(),
        kind: text_kind(tag),
        class: attr(node, "class").unwrap_or_default().to_string(),
        class_bindings: parse_class_bindings(node, state_specs)?,
        content: parse_text_content(node)?,
        conditional: parse_conditional(node, state_specs)?,
        show_expr: parse_show_attr(node, state_specs)?,
        ref_binding: parse_ref_binding(node)?,
        style,
    })
}

fn text_kind(tag: &str) -> DeclarativeTextKind {
    match tag {
        "p" => DeclarativeTextKind::Paragraph,
        "small" => DeclarativeTextKind::Small,
        "legend" => DeclarativeTextKind::Legend,
        "strong" => DeclarativeTextKind::Strong,
        "em" => DeclarativeTextKind::Emphasis,
        "h1" => DeclarativeTextKind::Heading { level: 1 },
        "h2" => DeclarativeTextKind::Heading { level: 2 },
        "h3" => DeclarativeTextKind::Heading { level: 3 },
        "h4" => DeclarativeTextKind::Heading { level: 4 },
        "h5" => DeclarativeTextKind::Heading { level: 5 },
        "h6" => DeclarativeTextKind::Heading { level: 6 },
        _ => DeclarativeTextKind::Generic,
    }
}