1use std::io;
2
3use io::BufRead;
4
5use io::BufWriter;
6use io::Write;
7
8use serde_json::Deserializer;
9use serde_json::Map;
10use serde_json::Value;
11use serde_json::de::IoRead;
12
13pub fn reader2maps<R>(rdr: R) -> impl Iterator<Item = Result<Map<String, Value>, io::Error>>
14where
15 R: BufRead,
16{
17 let irdr = IoRead::new(rdr);
18 let deser = Deserializer::new(irdr);
19 deser.into_iter().map(|r| r.map_err(io::Error::other))
20}
21
22pub fn pair2writer<W>(w: &mut W, label: &str, value: &Value, is1st: bool) -> Result<(), io::Error>
23where
24 W: Write,
25{
26 let prefix: &str = match is1st {
27 true => "",
28 false => "\t",
29 };
30 match value {
31 Value::String(s) => write!(w, "{prefix}{label}:{s}"),
32 _ => write!(w, "{prefix}{label}:{value}"),
33 }
34}
35
36pub fn map2writer<W>(w: &mut W, m: &Map<String, Value>) -> Result<(), io::Error>
37where
38 W: Write,
39{
40 for (ix, pair) in m.iter().enumerate() {
41 let (label, value) = pair;
42 let is1st: bool = 0 == ix;
43 pair2writer(w, label, value, is1st)?;
44 }
45 writeln!(w)?;
46 Ok(())
47}
48
49pub fn reader2maps2ltsv2writer<R, W>(rdr: R, mut wtr: W) -> Result<(), io::Error>
50where
51 R: BufRead,
52 W: Write,
53{
54 let maps = reader2maps(rdr);
55 for rslt in maps {
56 let m: Map<_, _> = rslt?;
57 map2writer(&mut wtr, &m)?;
58 }
59 wtr.flush()
60}
61
62pub fn stdin2maps2ltsv2stdout() -> Result<(), io::Error> {
63 let o = io::stdout();
64 let mut ol = o.lock();
65 reader2maps2ltsv2writer(io::stdin().lock(), BufWriter::new(&mut ol))?;
66 ol.flush()
67}