summaryrefslogtreecommitdiffstats
path: root/vendor/snap/examples/compress-escaped.rs
blob: 6fc97e9ac3529c429fb2727a6f870b1002e2ab60 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use std::env;
use std::io::{self, Write};
use std::process;

fn main() {
    let bytes = match env::args().nth(1) {
        None => {
            writeln!(&mut io::stderr(), "Usage: compress-escaped string")
                .unwrap();
            process::exit(1);
        }
        Some(arg) => arg.into_bytes(),
    };
    let compressed = frame_press(&bytes);
    println!("{}", escape(&compressed));
    println!("{}", escape(&frame_depress(&compressed)));
}

fn frame_press(bytes: &[u8]) -> Vec<u8> {
    use snap::write;

    let mut wtr = write::FrameEncoder::new(vec![]);
    wtr.write_all(bytes).unwrap();
    wtr.into_inner().unwrap()
}

fn frame_depress(bytes: &[u8]) -> Vec<u8> {
    use snap::read;
    use std::io::Read;

    let mut buf = vec![];
    read::FrameDecoder::new(bytes).read_to_end(&mut buf).unwrap();
    buf
}

fn escape(bytes: &[u8]) -> String {
    use std::ascii::escape_default;
    bytes.iter().flat_map(|&b| escape_default(b)).map(|b| b as char).collect()
}