use crate::ast::node_utils::{children, AstNodeAndId};
use crate::ast::{AstGraph, AstNode};
use crate::syntax::_node_builders::core::SyntaxNodeBuildError;
use crate::syntax::core_nodes::{AwaitExpression, CoreSyntaxNodeWithId};
use alloc::borrow::ToOwned;
use alloc::vec::Vec;
pub fn build_await_expression(
graph: &AstGraph,
node: &AstNode,
build_syntax_node: impl Fn(AstNodeAndId) -> Result<CoreSyntaxNodeWithId, SyntaxNodeBuildError>,
) -> Result<AwaitExpression, SyntaxNodeBuildError> {
children(graph, node)
.map_err(SyntaxNodeBuildError::ResolutionError)
.map(|all_children| {
all_children
.into_iter()
.filter(|(child, _)| {
!matches!(child.kind.as_str(), "line_comment" | "block_comment")
})
.collect::<Vec<_>>()
})
.and_then(|code_children| match code_children.as_slice() {
[expression, (dot, _), (keyword, _)] if dot.kind == "." && keyword.kind == "await" => {
Ok(*expression)
}
_ => Err(SyntaxNodeBuildError::Error(
"An AwaitExpression must be an expression followed by `.await`".to_owned(),
)),
})
.and_then(build_syntax_node)
.map(|expression| AwaitExpression { expression })
}
#[cfg(test)]
mod tests;