fluidattacks-blends-domain 0.40.0

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
use crate::ast::node_utils::AstNodeAndId;
use crate::ast::AstGraph;
use crate::syntax::_node_builders::core::SyntaxNodeBuildError;
use crate::syntax::_node_builders::languages::rust::arguments::build_arguments;
use crate::syntax::_node_builders::languages::rust::array_expression::build_array_expression;
use crate::syntax::_node_builders::languages::rust::attribute_item::build_attribute_item;
use crate::syntax::_node_builders::languages::rust::boolean_literal::build_boolean_literal;
use crate::syntax::_node_builders::languages::rust::comment::{build_comment, build_multi_comment};
use crate::syntax::_node_builders::languages::rust::empty_statement::build_empty_statement;
use crate::syntax::_node_builders::languages::rust::extern_crate_declaration::build_extern_crate_declaration;
use crate::syntax::_node_builders::languages::rust::inner_attribute_item::build_inner_attribute_item;
use crate::syntax::_node_builders::languages::rust::number_literal::build_number_literal;
use crate::syntax::_node_builders::languages::rust::string_literal::build_string_literal;
use crate::syntax::core_nodes::{CoreSyntaxNode, CoreSyntaxNodeWithId};
use alloc::boxed::Box;

pub fn build_syntax_node(
    graph: &AstGraph,
    (node, n_id): AstNodeAndId,
) -> Result<CoreSyntaxNodeWithId, SyntaxNodeBuildError> {
    // the annotated `'_` makes the closure generic over the node lifetime
    let self_fn = |child: AstNodeAndId<'_>| build_syntax_node(graph, child);
    let core_node = match node.kind.as_str() {
        "arguments" => build_arguments(graph, node, self_fn)
            .map(Box::new)
            .map(CoreSyntaxNode::ArgumentList),
        "array_expression" => build_array_expression(graph, node, self_fn)
            .map(Box::new)
            .map(CoreSyntaxNode::ArrayExpression),
        "boolean_literal" => build_boolean_literal(graph, node).map(CoreSyntaxNode::BoolLiteral),
        "integer_literal" | "float_literal" => {
            build_number_literal(node).map(CoreSyntaxNode::NumberLiteral)
        }
        "string_literal" | "char_literal" | "raw_string_literal" => {
            build_string_literal(graph, node).map(CoreSyntaxNode::StringLiteral)
        }
        "line_comment" | "doc_comment" => build_comment(graph, node).map(CoreSyntaxNode::Comment),
        "block_comment" => build_multi_comment(graph, node).map(CoreSyntaxNode::Comment),
        "attribute_item" => build_attribute_item(graph, node).map(CoreSyntaxNode::Comment),
        "inner_attribute_item" => {
            build_inner_attribute_item(graph, node).map(CoreSyntaxNode::Comment)
        }
        "extern_crate_declaration" => {
            build_extern_crate_declaration(graph, node).map(CoreSyntaxNode::Comment)
        }
        "empty_statement" => build_empty_statement(graph, node).map(CoreSyntaxNode::Comment),
        _ => Err(SyntaxNodeBuildError::UnsupportedNode(node.kind.clone())),
    };
    core_node.map(|c| (c, n_id))
}