Files
qr/src/main.rs
2020-04-18 23:42:59 +08:00

2.1 KiB

use clap::{Arg, App};
use qrcode::QrCode;
 
const C_W: char = ' ';
const C_B: char = '█';
const W: &str = " ";
const B: &str = " ";
const NL: &str = "\n";
 
fn main() -> Result<(), Box<dyn std::error::Error>> {
let matches = App::new("QR cli")
.version("0.1.1")
.author("Hatter Jiang <jht5945@gmail.com>")
.about("QR command line tool")
.arg(Arg::with_name("INPUT")
.help("Set the QR input")
.required(true)
.index(1))
.get_matches();
 
let mut input: Option<String> = None;
if let Some(input_arg) = matches.args.get("INPUT") {
if !input_arg.vals.is_empty() {
input = input_arg.vals[0].clone().into_string().ok();
}
}
 
let input_string = match input {
Some(i) => i, None => return Ok(()), // TODO no input
};
 
let code = QrCode::new(input_string.as_bytes()).unwrap();
let string = code.render::<char>()
.quiet_zone(false)
.module_dimensions(2, 1)
.build();
let mut output_stirng = String::with_capacity(1024);
let mut ln_len = 0;
for c in string.chars() {
match c {
C_B | C_W => ln_len += 1,
_ => break,
}
}
println!("【QR text for: {}】", &input_string);
for _ in 0..ln_len+4 {
output_stirng.push_str(W);
}
output_stirng.push_str(NL);
output_stirng.push_str(W);
output_stirng.push_str(W);
for c in string.chars() {
match c {
C_B => output_stirng.push_str(B),
C_W => output_stirng.push_str(W),
_ => { // new line
output_stirng.push_str(W);
output_stirng.push_str(W);
output_stirng.push(c);
output_stirng.push_str(W);
output_stirng.push_str(W);
}
}
}
output_stirng.push_str(W);
output_stirng.push_str(W);
output_stirng.push_str(NL);
for _ in 0..ln_len+4 {
output_stirng.push_str(W);
}
println!("{}", output_stirng);
 
Ok(())
}