bytebraise_syntax/syntax/
make.rs1use crate::parser::parse_bitbake_from_str;
5use crate::syntax::ast::AstNode;
6use crate::syntax::ast::nodes::Assignment;
7use crate::syntax::ast::quoted_value::QuotedValue;
8use itertools::Itertools;
9
10pub fn ast_from_text<N: AstNode>(text: &str) -> N {
11 let parse = parse_bitbake_from_str(text);
12
13 let node = match parse.syntax().descendants().find_map(N::cast) {
14 Some(it) => it,
15 None => {
16 panic!(
17 "Failed to make ast node `{}` from text {}",
18 std::any::type_name::<N>(),
19 text
20 )
21 }
22 };
23 let node = node.clone_subtree();
24 assert_eq!(node.syntax().text_range().start(), 0.into());
25 node
26}
27
28pub fn assignment(var: String, op: String, value: String) -> Assignment {
29 ast_from_text::<Assignment>(&format!("{var} {op} {value}")).clone_for_update()
30}
31
32pub fn quoted_value(text: String) -> QuotedValue {
33 let input = format!("A = \"{text}\"");
35 let assignment: Assignment = ast_from_text(&input);
36 assignment.clone_for_update().right()
37}
38
39pub fn quoted_value_from_slice(vals: &[String]) -> QuotedValue {
41 match vals.len() {
42 0 => quoted_value(String::new()),
43 1 => quoted_value(vals[0].clone()),
44 _ => {
45 let text = format!(
46 " \\\n{} \\\n",
47 vals.iter().map(|v| format!(" {v}")).join(" \\\n")
48 );
49 quoted_value(text)
50 }
51 }
52}