use crate::ast::node_utils::ensure_only_one_child;
use crate::ast::AstGraph;
use crate::syntax::_node_builders::core::SyntaxNodeBuildError;
use crate::{ast::AstNode, syntax::SyntaxNode};
use alloc::borrow::ToOwned;
use alloc::boxed::Box;
pub fn build_literal(node: &AstNode, value_type: &str) -> Result<SyntaxNode, SyntaxNodeBuildError> {
node.text.as_deref().map_or_else(
|| {
Err(SyntaxNodeBuildError::Error(
"A literal node must have a value".to_owned(),
))
},
|value| {
Ok(SyntaxNode::Literal {
value: value.to_owned(),
value_type: value_type.to_owned(),
})
},
)
}
pub fn build_boolean_literal(node: &AstNode) -> Result<SyntaxNode, SyntaxNodeBuildError> {
let text_exist_and_is_empty = node.text.as_deref().map_or_else(|| false, str::is_empty);
if text_exist_and_is_empty {
return Err(SyntaxNodeBuildError::Error(
"A boolean literal must have a non-empty value".to_owned(),
));
}
build_literal(node, "bool").map_err(|e| SyntaxNodeBuildError::ChainedError {
msg: "Cannot build a boolean literal".to_owned(),
parent: Box::new(e),
})
}
pub fn build_boolean_literal_from_child(
graph: &AstGraph,
node: &AstNode,
) -> Result<SyntaxNode, SyntaxNodeBuildError> {
ensure_only_one_child(graph, node)
.map_err(SyntaxNodeBuildError::ResolutionError)
.and_then(build_boolean_literal)
}