From 94940adf35daf4bcba1f2ccf68ae7912db20f7ae Mon Sep 17 00:00:00 2001 From: Ali MJ Al-Nasrawy Date: Tue, 31 Aug 2021 15:17:24 +0300 Subject: Print QR code to terminal --- src/main.rs | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/main.rs b/src/main.rs index e5cc596..b8e2e4b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -12,6 +12,7 @@ use clap::{crate_version, Clap, IntoApp}; use clap_generate::generators::{Bash, Elvish, Fish, PowerShell, Zsh}; use clap_generate::{generate, Shell}; use log::{error, warn}; +use qrcodegen::{QrCode, QrCodeEcc}; use yansi::{Color, Paint}; mod archive; @@ -183,7 +184,6 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { Some(ref random_route) => format!("{}/{}", url, random_route), None => url, }) - .map(|url| Color::Green.paint(url).bold().to_string()) .collect::>() }; @@ -246,9 +246,31 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { println!( "Availabe at (non-exhaustive list):\n {}\n", - display_urls.join("\n "), + display_urls + .iter() + .map(|url| Color::Green.paint(url).bold().to_string()) + .collect::>() + .join("\n "), ); + // print QR code to terminal + if miniserve_config.show_qrcode && atty::is(atty::Stream::Stdout) { + for url in display_urls + .iter() + .filter(|url| !url.contains("//127.0.0.1:") && !url.contains("//[::1]:")) + { + match QrCode::encode_text(url, QrCodeEcc::Low) { + Ok(qr) => { + println!("QR code for {} :", Color::Green.paint(url).bold()); + print_qr(&qr); + } + Err(e) => { + error!("Failed to render QR to terminal: {}", e); + } + }; + } + } + if atty::is(atty::Stream::Stdout) { println!("Quit by pressing CTRL-C"); } @@ -338,3 +360,21 @@ async fn css() -> impl Responder { .insert_header(ContentType(mime::TEXT_CSS)) .message_body(css.into()) } + +// Prints the given QrCode object to the console. +fn print_qr(qr: &QrCode) { + let border: i32 = 4; + for y in (-border..qr.size() + border).step_by(2) { + for x in -border..qr.size() + border { + let c: char = match (qr.get_module(x, y), qr.get_module(x, y + 1)) { + (false, false) => ' ', + (true, false) => '▀', + (false, true) => '▄', + (true, true) => '█', + }; + print!("{0}", c); + } + println!(); + } + println!(); +} -- cgit v1.2.3 From 83aa3fddb739b2f35158b1b3aff3c5100628074e Mon Sep 17 00:00:00 2001 From: Ali MJ Al-Nasrawy Date: Tue, 31 Aug 2021 16:16:36 +0300 Subject: Address review comments --- src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/main.rs b/src/main.rs index b8e2e4b..4fb191a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -261,7 +261,7 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> { { match QrCode::encode_text(url, QrCodeEcc::Low) { Ok(qr) => { - println!("QR code for {} :", Color::Green.paint(url).bold()); + println!("QR code for {}:", Color::Green.paint(url).bold()); print_qr(&qr); } Err(e) => { -- cgit v1.2.3 From 323934b21700db4e6d9878ce4b8f73e204e66e6e Mon Sep 17 00:00:00 2001 From: Ali MJ Al-Nasrawy Date: Tue, 31 Aug 2021 17:30:07 +0300 Subject: Print inverted QR codes side-by-side --- src/main.rs | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/main.rs b/src/main.rs index 4fb191a..5259bee 100644 --- a/src/main.rs +++ b/src/main.rs @@ -361,12 +361,22 @@ async fn css() -> impl Responder { .message_body(css.into()) } -// Prints the given QrCode object to the console. +// Prints to the console two inverted QrCodes side by side. fn print_qr(qr: &QrCode) { - let border: i32 = 4; - for y in (-border..qr.size() + border).step_by(2) { - for x in -border..qr.size() + border { - let c: char = match (qr.get_module(x, y), qr.get_module(x, y + 1)) { + let border = 4; + let size = qr.size() + 2 * border; + + for y in (0..size).step_by(2) { + for x in 0..2 * size { + let inverted = x >= size; + let (x, y) = (x % size - border, y - border); + + //each char represents two vertical modules + let (mod1, mod2) = match inverted { + false => (qr.get_module(x, y), qr.get_module(x, y + 1)), + true => (!qr.get_module(x, y), !qr.get_module(x, y + 1)), + }; + let c = match (mod1, mod2) { (false, false) => ' ', (true, false) => '▀', (false, true) => '▄', -- cgit v1.2.3