use crate::ast::Expr;
pub fn json(column: &str, key: &str) -> JsonBuilder {
JsonBuilder {
column: column.to_string(),
path_segments: vec![(key.to_string(), true)], alias: None,
}
}
pub fn json_path<S: AsRef<str>>(column: &str, keys: impl IntoIterator<Item = S>) -> JsonBuilder {
let keys_vec: Vec<_> = keys.into_iter().collect();
let len = keys_vec.len();
let path_segments: Vec<(String, bool)> = keys_vec
.into_iter()
.enumerate()
.map(|(i, k)| (k.as_ref().to_string(), i == len - 1)) .collect();
JsonBuilder {
column: column.to_string(),
path_segments,
alias: None,
}
}
pub fn json_obj(column: &str, key: &str) -> JsonBuilder {
JsonBuilder {
column: column.to_string(),
path_segments: vec![(key.to_string(), false)], alias: None,
}
}
#[derive(Debug, Clone)]
pub struct JsonBuilder {
pub(crate) column: String,
pub(crate) path_segments: Vec<(String, bool)>,
pub(crate) alias: Option<String>,
}
impl JsonBuilder {
pub fn get(mut self, key: &str) -> Self {
self.path_segments.push((key.to_string(), false));
self
}
pub fn get_text(mut self, key: &str) -> Self {
self.path_segments.push((key.to_string(), true));
self
}
pub fn alias(mut self, name: &str) -> Expr {
self.alias = Some(name.to_string());
self.build()
}
pub fn build(self) -> Expr {
Expr::JsonAccess {
column: self.column,
path_segments: self.path_segments,
alias: self.alias,
}
}
}
impl From<JsonBuilder> for Expr {
fn from(builder: JsonBuilder) -> Self {
builder.build()
}
}