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)))
}