1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
use super::{Function, FunctionType};
use crate::ast::Expression;
use std::borrow::Cow;

#[derive(Debug, Clone, PartialEq)]
pub struct JsonBuildObject<'a> {
    pub(crate) values: Vec<(Cow<'a, str>, Expression<'a>)>,
}

pub fn json_build_object<'a, S, E>(values: impl IntoIterator<Item = (S, E)>) -> Function<'a>
where
    S: Into<Cow<'a, str>>,
    E: Into<Expression<'a>>,
{
    let values = values
        .into_iter()
        .map(|(name, value)| (name.into(), value.into()))
        .collect();

    let function = JsonBuildObject { values };

    function.into()
}

impl<'a> From<JsonBuildObject<'a>> for Function<'a> {
    fn from(value: JsonBuildObject<'a>) -> Self {
        Self {
            typ_: FunctionType::JsonBuildObject(value),
            alias: None,
        }
    }
}