qail_core/ast/builders/
json.rs1use crate::ast::Expr;
4
5pub fn json(column: &str, key: &str) -> JsonBuilder {
11 JsonBuilder {
12 column: column.to_string(),
13 path_segments: vec![(key.to_string(), true)], alias: None,
15 }
16}
17
18pub fn json_path<S: AsRef<str>>(column: &str, keys: impl IntoIterator<Item = S>) -> JsonBuilder {
26 let keys_vec: Vec<_> = keys.into_iter().collect();
27 let len = keys_vec.len();
28 let path_segments: Vec<(String, bool)> = keys_vec
29 .into_iter()
30 .enumerate()
31 .map(|(i, k)| (k.as_ref().to_string(), i == len - 1)) .collect();
33
34 JsonBuilder {
35 column: column.to_string(),
36 path_segments,
37 alias: None,
38 }
39}
40
41pub fn json_obj(column: &str, key: &str) -> JsonBuilder {
43 JsonBuilder {
44 column: column.to_string(),
45 path_segments: vec![(key.to_string(), false)], alias: None,
47 }
48}
49
50#[derive(Debug, Clone)]
52pub struct JsonBuilder {
53 pub(crate) column: String,
54 pub(crate) path_segments: Vec<(String, bool)>,
55 pub(crate) alias: Option<String>,
56}
57
58impl JsonBuilder {
59 pub fn get(mut self, key: &str) -> Self {
61 self.path_segments.push((key.to_string(), false));
62 self
63 }
64
65 pub fn get_text(mut self, key: &str) -> Self {
67 self.path_segments.push((key.to_string(), true));
68 self
69 }
70
71 pub fn alias(mut self, name: &str) -> Expr {
73 self.alias = Some(name.to_string());
74 self.build()
75 }
76
77 pub fn build(self) -> Expr {
79 Expr::JsonAccess {
80 column: self.column,
81 path_segments: self.path_segments,
82 alias: self.alias,
83 }
84 }
85}
86
87impl From<JsonBuilder> for Expr {
88 fn from(builder: JsonBuilder) -> Self {
89 builder.build()
90 }
91}