1 // The main documentation is in the README. |
1 // The main documentation is in the README. |
2 #![doc = include_str!("../README.md")] |
2 #![doc = include_str!("../README.md")] |
3 |
3 |
4 use std::io; |
4 use std::io; |
5 use std::io::BufWriter; |
5 use std::fs::File; |
|
6 use std::io::{BufWriter, BufRead, BufReader}; |
6 use std::io::Write; |
7 use std::io::Write; |
7 use clap::Parser; |
8 use clap::Parser; |
8 |
9 |
9 /// Command line parameters |
10 /// Command line parameters |
10 #[derive(Parser, Debug)] |
11 #[derive(Parser, Debug)] |
12 about = env!("CARGO_PKG_DESCRIPTION"), |
13 about = env!("CARGO_PKG_DESCRIPTION"), |
13 author = env!("CARGO_PKG_AUTHORS"), |
14 author = env!("CARGO_PKG_AUTHORS"), |
14 version = env!("CARGO_PKG_VERSION"), |
15 version = env!("CARGO_PKG_VERSION"), |
15 )] |
16 )] |
16 struct CommandLineArgs { |
17 struct CommandLineArgs { |
|
18 /// Input file (default is stdin) |
|
19 input : Option<String>, |
|
20 |
|
21 /// Output file (defalt is stdout) |
|
22 #[arg(long, short = 'o')] |
|
23 output : Option<String>, |
|
24 |
17 #[arg(long, short = 'c')] |
25 #[arg(long, short = 'c')] |
18 /// Strip comments |
26 /// Strip comments |
19 strip_comments : bool, |
27 strip_comments : bool, |
20 |
28 |
21 #[arg(long, short = 'w')] |
29 #[arg(long, short = 'w')] |
111 } |
119 } |
112 } |
120 } |
113 |
121 |
114 fn main() { |
122 fn main() { |
115 let cli = CommandLineArgs::parse(); |
123 let cli = CommandLineArgs::parse(); |
116 let input = io::stdin(); |
124 let input = cli.input.map_or_else( |
117 |
125 || Box::new(BufReader::new(io::stdin())) as Box<dyn BufRead>, |
|
126 |f| Box::new(BufReader::new(File::open(f).unwrap())) as Box<dyn BufRead> |
|
127 ); |
|
128 let output = cli.output.map_or_else( |
|
129 || Box::new(BufWriter::new(io::stdout())) as Box<dyn Write>, |
|
130 |f| Box::new(BufWriter::new(File::create(f).unwrap())) as Box<dyn Write> |
|
131 ); |
|
132 |
118 let mut o = Out { |
133 let mut o = Out { |
119 only_whitespace : true, |
134 only_whitespace : true, |
120 stored_whitespace : String::new(), |
135 stored_whitespace : String::new(), |
121 output : BufWriter::new(io::stdout()), |
136 output, |
122 stack : Vec::new(), |
137 stack : Vec::new(), |
123 whitespace_satisfied : true, |
138 whitespace_satisfied : true, |
124 par_satisfied : true, |
139 par_satisfied : true, |
125 }; |
140 }; |
126 |
141 |