fluidattacks-blends-domain 0.17.1

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
use crate::syntax::fields::ruby::pair;
use crate::{
    query::pred_ast,
    syntax::{
        builders::{
            named_argument::build_named_argument_node, pair::build_pair_node,
            symbol_lookup::build_symbol_lookup_node,
        },
        SyntaxGraphArgs, SyntaxGraphError,
    },
    utilities::text_nodes::node_to_str,
    CodeGraph, NodeId,
};

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

    let key_id = args.required_field_alt(n_id, pair::KEY)?;

    let Some(value_id) = args.optional_field_alt(n_id, pair::VALUE) else {
        let symbol = node_to_str(graph, key_id);
        return Ok(Some(build_symbol_lookup_node(args, n_id, symbol)));
    };

    if let Some(parent) = pred_ast(graph, n_id, Some(1)).first() {
        if graph.label_type(*parent) == Some("argument_list") {
            let arg_name = node_to_str(graph, key_id);
            return build_named_argument_node(args, n_id, Some(arg_name), value_id).map(Some);
        }
    }

    build_pair_node(args, n_id, key_id, value_id).map(Some)
}