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 let input = [0x82, 0x01, 0x02];
47 let mut output = Vec::new();
48 export_from_reader("json", "\n", &input[..], &mut output).unwrap();
49 assert::equal(output, b"[1,2]".as_slice());
51 }
52
53 #[test]
54 fn test_export_from_reader_to_yaml() {
55 let input = [0x82, 0x01, 0x02];
57 let mut output = Vec::new();
58 export_from_reader("yaml", "\n", &input[..], &mut output).unwrap();
59 assert::equal(output, b"- 1\n- 2\n".as_slice());
61 }
62
63 #[test]
64 fn test_export_from_reader_to_cbor() {
65 let input = [0x82, 0x01, 0x02];
67 let mut output = Vec::new();
68 export_from_reader("cbor", "\n", &input[..], &mut output).unwrap();
69 assert::equal(output, b"\x82\x01\x02".as_slice());
71 }
72
73 #[test]
74 fn test_export_from_reader_to_json_given_object() {
75 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 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 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 assert::equal(output, b"a: a\n\na\n".as_slice());
91 }
92}