reserialize_sise/
reserialize_sise.rs

1#![deny(
2    rust_2018_idioms,
3    trivial_casts,
4    trivial_numeric_casts,
5    unreachable_pub,
6    unused_must_use,
7    unused_qualifications
8)]
9#![forbid(unsafe_code)]
10
11fn main() {
12    let args: Vec<_> = std::env::args_os().collect();
13    if args.len() != 3 {
14        eprintln!(
15            "Usage: {} [compact|spaced] [input-file]",
16            args[0].to_string_lossy()
17        );
18        std::process::exit(1);
19    }
20
21    enum SerializeStyle {
22        Compact,
23        Spaced,
24    }
25
26    let serialize_style = match &*args[1].to_string_lossy() {
27        "compact" => SerializeStyle::Compact,
28        "spaced" => SerializeStyle::Spaced,
29        _ => {
30            eprintln!("Unknown style {:?}.", args[1]);
31            std::process::exit(1);
32        }
33    };
34
35    let file_data = std::fs::read(&args[2]).unwrap();
36    let file_data = String::from_utf8(file_data).unwrap();
37    let mut parser = sise::Parser::new(&file_data);
38    let parsed = sise::parse_tree(&mut parser).unwrap();
39    parser.finish().unwrap();
40
41    let break_line_at = match serialize_style {
42        SerializeStyle::Compact => usize::MAX,
43        SerializeStyle::Spaced => 0,
44    };
45    let mut reserialized = String::new();
46    let mut serializer = sise::Serializer::new(
47        sise::SerializerStyle {
48            line_break: "\n",
49            indentation: "  ",
50        },
51        &mut reserialized,
52    );
53    sise::serialize_tree(&mut serializer, &parsed, break_line_at);
54    serializer.finish(false);
55    println!("{}", reserialized);
56}