fluidattacks-blends-domain 0.44.3

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
use crate::ast::node_utils::{children, ensure_node, AstNodeAndId};
use crate::ast::{AstGraph, AstNode};
use crate::syntax::_node_builders::core::SyntaxNodeBuildError;
use crate::syntax::core_nodes::{CoreSyntaxNodeWithId, ReferenceExpression};
use crate::syntax::fields::rust::reference_expression;
use crate::syntax::fields::RequiredField;
use alloc::borrow::ToOwned;

pub fn build_reference_expression(
    graph: &AstGraph,
    node: &AstNode,
    build_syntax_node: impl Fn(AstNodeAndId) -> Result<CoreSyntaxNodeWithId, SyntaxNodeBuildError>,
) -> Result<ReferenceExpression, SyntaxNodeBuildError> {
    let all_children = children(graph, node).map_err(SyntaxNodeBuildError::ResolutionError)?;
    let is_raw = all_children.iter().any(|(child, _)| child.kind == "raw");
    let is_mutable = all_children
        .iter()
        .any(|(child, _)| child.kind == "mutable_specifier");
    let value_id = node
        .fields
        .get(reference_expression::VALUE.name())
        .copied()
        .ok_or_else(|| {
            SyntaxNodeBuildError::Error("A ReferenceExpression must have a value".to_owned())
        })?;
    ensure_node(graph, value_id)
        .map_err(SyntaxNodeBuildError::ResolutionError)
        .and_then(build_syntax_node)
        .map(|value| ReferenceExpression {
            value,
            is_mutable,
            is_raw,
        })
}

#[cfg(test)]
mod tests;