clickhouse_format/output/
json_strings.rs

1use std::collections::HashMap;
2
3use serde::de::DeserializeOwned;
4
5use crate::format_name::FormatName;
6
7use super::{json::JsonOutput, Output, OutputResult};
8
9type Inner<T> = JsonOutput<T>;
10
11#[derive(Default)]
12pub struct JsonStringsOutput<T> {
13    inner: Inner<T>,
14}
15impl<T> JsonStringsOutput<T> {
16    pub fn new() -> Self {
17        Self {
18            inner: Inner::new(),
19        }
20    }
21}
22pub type GeneralJsonStringsOutput = JsonStringsOutput<HashMap<String, String>>;
23
24impl<T> Output for JsonStringsOutput<T>
25where
26    T: DeserializeOwned,
27{
28    type Row = <Inner<T> as Output>::Row;
29    type Info = <Inner<T> as Output>::Info;
30
31    type Error = <Inner<T> as Output>::Error;
32
33    fn format_name() -> crate::format_name::FormatName {
34        FormatName::JsonStrings
35    }
36
37    fn deserialize(&self, slice: &[u8]) -> OutputResult<Self::Row, Self::Info, Self::Error> {
38        self.inner.deserialize(slice)
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    use std::{fs, path::PathBuf};
47
48    use crate::test_helpers::{TestStringsRow, TEST_STRINGS_ROW_1};
49
50    #[test]
51    fn simple() -> Result<(), Box<dyn std::error::Error>> {
52        let file_path = PathBuf::new().join("tests/files/JSONStrings.json");
53        let content = fs::read_to_string(&file_path)?;
54
55        assert_eq!(
56            GeneralJsonStringsOutput::format_name(),
57            file_path
58                .file_stem()
59                .unwrap()
60                .to_string_lossy()
61                .parse()
62                .unwrap()
63        );
64
65        let (rows, info) = GeneralJsonStringsOutput::new().deserialize(content.as_bytes())?;
66        assert_eq!(rows.first().unwrap().get("tuple1").unwrap(), "(1,'a')");
67        assert_eq!(info.rows, 2);
68
69        let (rows, info) =
70            JsonStringsOutput::<TestStringsRow>::new().deserialize(content.as_bytes())?;
71        assert_eq!(rows.first().unwrap(), &*TEST_STRINGS_ROW_1);
72        assert_eq!(info.rows, 2);
73
74        Ok(())
75    }
76}