fluidattacks-blends-domain 0.3.0

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
use alloc::string::String;

use crate::syntax::{SyntaxGraphArgs, SyntaxGraphError, SyntaxNode};
use crate::NodeId;

#[allow(
    clippy::too_many_arguments,
    reason = "mirrors the Python builder: condition plus three optional branches"
)]
pub fn build_if_node(
    args: &mut SyntaxGraphArgs<'_>,
    n_id: NodeId,
    condition_id: NodeId,
    true_id: Option<NodeId>,
    false_id: Option<NodeId>,
    initializer: Option<NodeId>,
) -> Result<NodeId, SyntaxGraphError> {
    args.syntax_graph.add_node(
        n_id,
        SyntaxNode::If {
            condition_id,
            true_id,
            false_id,
            initializer,
        },
    );

    let stack_depth_before = args.metadata.sanitization_stack.len();
    args.metadata
        .sanitization_stack
        .push((String::from("condition_pending"), n_id));
    let built_condition = args.generic(condition_id)?;
    args.syntax_graph.add_ast_edge(n_id, built_condition);
    args.metadata
        .sanitization_stack
        .truncate(stack_depth_before);

    if let Some(true_id) = true_id {
        args.metadata.control_flow_stack.push(n_id);
        let built = args.generic(true_id)?;
        args.syntax_graph.add_ast_edge(n_id, built);
        args.metadata.control_flow_stack.pop();
    }

    if let Some(false_id) = false_id {
        args.metadata.control_flow_stack.push(false_id);
        let built = args.generic(false_id)?;
        args.syntax_graph.add_ast_edge(n_id, built);
        args.metadata.control_flow_stack.pop();
    }

    if let Some(initializer) = initializer {
        let built = args.generic(initializer)?;
        args.syntax_graph.add_ast_edge(n_id, built);
    }

    Ok(n_id)
}