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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#[macro_use]
extern crate clap;
use clap::{App, Arg, ArgMatches};
extern crate rqr;
use rqr::{Qr, SvgRenderer, StringRenderer, Color};
fn main() {
let matches = App::new("rqr cli")
.author(crate_authors!())
.version(crate_version!())
.arg(Arg::with_name("type")
.help("Output type")
.takes_value(true)
.possible_values(&["string", "svg"])
.default_value("string")
.short("t"))
.arg(Arg::with_name("input")
.help("String to encode")
.index(1)
.required(true))
.arg(Arg::with_name("bg")
.takes_value(true)
.long("bg")
.help("Background color to use for svg output"))
.arg(Arg::with_name("fg")
.takes_value(true)
.long("fg")
.help("Foreground color to use for svg output"))
.arg(Arg::with_name("width")
.takes_value(true)
.long("width")
.short("w")
.help("Image width for svg output"))
.get_matches();
let s = matches.value_of("input").unwrap();
let qr = Qr::new(s).expect("Input string too long");
match matches.value_of("type").unwrap() {
"svg" => output_svg(&qr, &matches),
_ => output_string(&qr, &matches),
}
//let mut builder = QrBuilder::new()
//.version(Version::new(1))
//.ecl(ECLevel::Q);
//builder.add_all("HELLO WORLD").unwrap();
//let s = SvgRenderer::new()
//.light_module(Color::new(229, 189, 227))
//.dark_module(Color::new(119, 0, 0))
//.dimensions(200, 200)
//.render(&builder.matrix);
//println!("{}", s);
//let qr = Qr::new("HELLO WORLD").unwrap();
//let s = StringRenderer::new().render(&qr);
//println!("{}", s);
////let s = SvgRenderer::new()
////.light_module(Color::new(229, 189, 227))
////.dark_module(Color::new(119, 0, 0))
////.dimensions(200, 200)
////.render(&builder.matrix);
//// TODO this should be an interface.
//let qr2: Qr = QrBuilder::new()
//.ecl(ECLevel::L)
//.version(Version::new(3))
//.mask(Mask::new(2))
//.mode(Mode::Byte)
//.into("HELLO WORLD")
//.unwrap();
//let s = StringRenderer::new().render(&qr2);
//println!("{}", s);
}
fn output_svg(qr: &Qr, matches: &ArgMatches) {
let mut r = SvgRenderer::new();
if let Some(bg) = matches.value_of("bg") {
let c: Color = bg.parse().expect("bg should be a color value like '#ff0033'");
r = r.light_module(c);
}
if let Some(fg) = matches.value_of("fg") {
let c: Color = fg.parse().expect("fg should be a color value like '#ff0033'");
r = r.dark_module(c);
}
if let Some(w) = matches.value_of("width") {
let w: usize = w.parse().expect("Width must be an integer value");
r = r.dimensions(w, w);
}
let s = r.render(&qr);
println!("{}", s);
}
fn output_string(qr: &Qr, _matches: &ArgMatches) {
// Pretty print in terminal.
let s = StringRenderer::new()
.dark_module('\u{2588}')
.light_module(' ')
.quiet_zone(true)
.module_dimensions(2, 1)
.render(&qr);
println!("{}", s);
}