fluidattacks-blends-domain 0.32.0

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
use crate::{
    query::{adj_ast, match_ast_d},
    syntax::{
        builders::while_statement::build_while_statement_node, fields::Field, SyntaxGraphArgs,
        SyntaxGraphError,
    },
    NodeId,
};

const CONDITION: Field<false> = Field::new("condition_id");
const BOUND_IDENTIFIER: Field<false> = Field::new("bound_identifier_id");

pub fn reader(
    args: &mut SyntaxGraphArgs<'_>,
    n_id: NodeId,
) -> Result<Option<NodeId>, SyntaxGraphError> {
    let graph = args.ast_graph;

    let mut condition_id = args.optional_field_alt(n_id, CONDITION);

    if condition_id.is_none() {
        condition_id = args.optional_field_alt(n_id, BOUND_IDENTIFIER);
    }

    let block_id = match_ast_d(graph, n_id, "statements", Some(1))
        .or_else(|| adj_ast(graph, n_id, Some(1), &[]).last().copied())
        .ok_or(SyntaxGraphError::UnexpectedAstShape)?;

    build_while_statement_node(args, n_id, block_id, condition_id).map(Some)
}