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> { let matches = App::new("QR cli") .version("0.1.1") .author("Hatter Jiang ") .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 = None; if let Some(input_arg) = matches.args.get("INPUT") { if input_arg.vals.len() > 0 { 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::() .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 test 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(()) }