Skip to main content

rs_jsonl2ltsv/
lib.rs

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}