fluidattacks-blends-domain 0.40.0

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
use crate::{
    ast::{node_utils::ensure_node, AstGraph, AstNode},
    syntax::{_node_builders::core::SyntaxNodeBuildError, SyntaxGraphArgs, SyntaxGraphError},
    NodeId,
};

pub fn generic_reader<T>(
    args: &mut SyntaxGraphArgs<'_>,
    n_id: NodeId,
    builder: impl Fn(&AstGraph, &AstNode) -> Result<T, SyntaxNodeBuildError>,
    mut reader: impl FnMut(&mut SyntaxGraphArgs<'_>, &T) -> Result<Option<NodeId>, SyntaxGraphError>,
) -> Result<Option<NodeId>, SyntaxGraphError> {
    let build_node = ensure_node(args.ast_graph, n_id)
        .map_err(SyntaxNodeBuildError::ResolutionError)
        .map(|n| n.0)
        .and_then(|node| builder(args.ast_graph, node));
    let handled = build_node.map(Some).or_else(|err| match err {
        SyntaxNodeBuildError::UnsupportedNode(_) => Ok(None),
        e => Err(e),
    });
    handled
        .map_err(|_| SyntaxGraphError::UnexpectedAstShape)
        .and_then(|c| c.map_or(Ok(None), |i| reader(args, &i)))
}