fluidattacks-blends-domain 0.37.0

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
use crate::ast::node_utils::ensure_only_one_child;
use crate::ast::AstGraph;
use crate::syntax::_node_builders::core::SyntaxNodeBuildError;
use crate::{ast::AstNode, syntax::SyntaxNode};
use alloc::borrow::ToOwned;
use alloc::boxed::Box;

pub fn build_literal(node: &AstNode, value_type: &str) -> Result<SyntaxNode, SyntaxNodeBuildError> {
    node.text.as_deref().map_or_else(
        || {
            Err(SyntaxNodeBuildError::Error(
                "A literal node must have a value".to_owned(),
            ))
        },
        |value| {
            Ok(SyntaxNode::Literal {
                value: value.to_owned(),
                value_type: value_type.to_owned(),
            })
        },
    )
}

pub fn build_boolean_literal(node: &AstNode) -> Result<SyntaxNode, SyntaxNodeBuildError> {
    let text_exist_and_is_empty = node.text.as_deref().map_or_else(|| false, str::is_empty);
    if text_exist_and_is_empty {
        return Err(SyntaxNodeBuildError::Error(
            "A boolean literal must have a non-empty value".to_owned(),
        ));
    }
    build_literal(node, "bool").map_err(|e| SyntaxNodeBuildError::ChainedError {
        msg: "Cannot build a boolean literal".to_owned(),
        parent: Box::new(e),
    })
}

pub fn build_boolean_literal_from_child(
    graph: &AstGraph,
    node: &AstNode,
) -> Result<SyntaxNode, SyntaxNodeBuildError> {
    // commonly a boolean_literal node does not have the value, its child holds it
    ensure_only_one_child(graph, node)
        .map_err(SyntaxNodeBuildError::ResolutionError)
        .and_then(build_boolean_literal)
}