cbor_cli/
export.rs

1use std::{io, process};
2
3pub fn export_from_reader<R: io::Read, W: io::Write>(
4  format: &str,
5  delimiter: &str,
6  reader: R,
7  mut writer: &mut W,
8) -> Result<(), Box<dyn std::error::Error>> {
9  serde_cbor::de::Deserializer::from_reader(reader)
10    .into_iter::<serde_cbor::Value>()
11    .map(|v| match v {
12      Ok(v) => v,
13      Err(e) => {
14        eprintln!("Error: {:?} {} {:?}", e.classify(), e.offset(), e);
15        process::exit(1);
16      }
17    })
18    .enumerate()
19    .try_for_each(|(i, v)| {
20      if i > 0 {
21        writer.write_all(delimiter.as_bytes())?;
22      }
23      if format == "json" {
24        serde_json::to_writer(&mut writer, &v).map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
25      } else if format == "yaml" {
26        serde_yaml::to_writer(&mut writer, &v).map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
27      } else if format == "toml" {
28        let s = toml::ser::to_string(&v).map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
29        writer.write_all(s.as_bytes())?;
30      } else {
31        serde_cbor::to_writer(&mut writer, &v).map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
32      }
33      Ok::<(), io::Error>(())
34    })?;
35  Ok(())
36}
37
38#[cfg(test)]
39mod tests {
40  use super::*;
41  use common_testing::assert;
42
43  #[test]
44  fn test_export_from_reader_to_json() {
45    // Exports some CBOR data.
46    let input = [0x82, 0x01, 0x02];
47    let mut output = Vec::new();
48    export_from_reader("json", "\n", &input[..], &mut output).unwrap();
49    // println!("{}", String::from_utf8(output.clone()).unwrap());
50    assert::equal(output, b"[1,2]".as_slice());
51  }
52
53  #[test]
54  fn test_export_from_reader_to_yaml() {
55    // Exports some CBOR data.
56    let input = [0x82, 0x01, 0x02];
57    let mut output = Vec::new();
58    export_from_reader("yaml", "\n", &input[..], &mut output).unwrap();
59    // println!("{}", String::from_utf8(output.clone()).unwrap());
60    assert::equal(output, b"- 1\n- 2\n".as_slice());
61  }
62
63  #[test]
64  fn test_export_from_reader_to_cbor() {
65    // Exports some CBOR data.
66    let input = [0x82, 0x01, 0x02];
67    let mut output = Vec::new();
68    export_from_reader("cbor", "\n", &input[..], &mut output).unwrap();
69    // println!("{}", String::from_utf8(output.clone()).unwrap());
70    assert::equal(output, b"\x82\x01\x02".as_slice());
71  }
72
73  #[test]
74  fn test_export_from_reader_to_json_given_object() {
75    // Exports
76    let input = [0xa1, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61];
77    let mut output = Vec::new();
78    export_from_reader("json", "\n", &input[..], &mut output).unwrap();
79    // println!("{}", String::from_utf8(output.clone()).unwrap());
80    assert::equal(output, b"{\"a\":\"a\"}\n\"a\"".as_slice());
81  }
82
83  #[test]
84  fn test_export_from_reader_to_yaml_given_object() {
85    // Exports
86    let input = [0xa1, 0x61, 0x61, 0x61, 0x61, 0x61, 0x61];
87    let mut output = Vec::new();
88    export_from_reader("yaml", "\n", &input[..], &mut output).unwrap();
89    // println!("{}", String::from_utf8(output.clone()).unwrap());
90    assert::equal(output, b"a: a\n\na\n".as_slice());
91  }
92}