beuvy 0.1.0

Facade crate for beuvy-runtime plus optional declarative UI authoring.
Documentation
use super::*;
use crate::ast::DeclarativeRuntimeExpr;

mod parser_block;
mod parser_core;

pub(crate) use parser_core::RuntimeExprParser;

pub(crate) fn parse_runtime_expr(
    node: XmlNode<'_, '_>,
    attr_name: &str,
    raw: &str,
) -> Result<DeclarativeRuntimeExpr, DeclarativeUiAssetLoadError> {
    let mut parser = RuntimeExprParser::new(node, attr_name, raw);
    let expr = parser.parse_expression()?;
    parser.expect_eof()?;
    Ok(expr)
}

pub(crate) fn parse_runtime_block(
    node: XmlNode<'_, '_>,
    attr_name: &str,
    raw: &str,
) -> Result<DeclarativeRuntimeExpr, DeclarativeUiAssetLoadError> {
    let mut parser = RuntimeExprParser::new(node, attr_name, raw);
    let statements = parser.parse_block_statements()?;
    parser.expect_eof()?;
    Ok(DeclarativeRuntimeExpr::Block(statements))
}

pub(crate) fn parse_runtime_number(raw: &str) -> Result<DeclarativeNumber, ()> {
    if raw.contains('.') {
        raw.parse::<f64>()
            .map(DeclarativeNumber::F64)
            .map_err(|_| ())
    } else if let Ok(value) = raw.parse::<i32>() {
        Ok(DeclarativeNumber::I32(value))
    } else {
        raw.parse::<i64>()
            .map(DeclarativeNumber::I64)
            .map_err(|_| ())
    }
}

pub(crate) fn expr_binding_path<'a>(
    expr: &'a DeclarativeRuntimeExpr,
) -> Option<std::borrow::Cow<'a, str>> {
    match expr {
        DeclarativeRuntimeExpr::BindingPath(path) => Some(std::borrow::Cow::Borrowed(path)),
        DeclarativeRuntimeExpr::FieldAccess { base, field } => {
            let mut path = expr_binding_path(base)?.into_owned();
            path.push('.');
            path.push_str(field);
            Some(std::borrow::Cow::Owned(path))
        }
        _ => None,
    }
}