ga_v4_flattener/
lib.rs

1extern crate itertools;
2extern crate serde;
3
4#[cfg(test)]
5#[macro_use]
6extern crate indoc;
7#[macro_use]
8extern crate serde_derive;
9#[macro_use]
10extern crate serde_json;
11
12pub mod to_delimited;
13pub mod to_row_array;
14pub mod types;
15
16use crate::to_delimited::response_to_delimited_reports;
17use crate::to_row_array::response_to_row_array;
18use crate::types::ReportResponse;
19use serde_json::value::Value;
20use serde_json::Error;
21
22pub fn to_delimited(raw_report_response: &str, delimiter: &str) -> Result<Vec<String>, Error> {
23    if raw_report_response.is_empty() {
24        return Ok(vec!["".to_string()]);
25    }
26
27    let deserialized_response: ReportResponse = serde_json::from_str(raw_report_response)?;
28
29    Ok(response_to_delimited_reports(
30        &deserialized_response,
31        &delimiter,
32    ))
33}
34
35pub fn to_flat_json(raw_report: &str) -> Result<Value, Error> {
36    if raw_report.is_empty() {
37        return Ok(json!("[]"));
38    }
39
40    let deserialized_response: ReportResponse = serde_json::from_str(raw_report)?;
41
42    Ok(response_to_row_array(&deserialized_response))
43}
44
45#[cfg(test)]
46mod tests {
47    use super::to_delimited;
48    use std::fs;
49    use std::path::PathBuf;
50
51    #[test]
52    fn rejects_reports_containing_unsupported_features() {
53        let data: String = fs::read_to_string(PathBuf::from(format!(
54            "{}{}",
55            env!("CARGO_MANIFEST_DIR"),
56            "/test_reports/unsupported_feature.json"
57        )))
58        .unwrap();
59
60        assert!(to_delimited(&data, ",").is_err())
61    }
62}