diff options
-rw-r--r-- | .github/workflows/build-release-binaries.yml | 6 | ||||
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | Cargo.lock | 32 | ||||
-rw-r--r-- | src/main.rs | 54 |
4 files changed, 72 insertions, 21 deletions
diff --git a/.github/workflows/build-release-binaries.yml b/.github/workflows/build-release-binaries.yml index 1c0440c..57beed7 100644 --- a/.github/workflows/build-release-binaries.yml +++ b/.github/workflows/build-release-binaries.yml @@ -160,7 +160,7 @@ jobs: run: | echo ::set-output name=current_version::${GITHUB_REF#refs/tags/v} shell: bash - if: startsWith('refs/tags/v', github.ref) + if: startsWith(github.ref, 'refs/tags/v') - name: Get CHANGELOG.md entry id: changelog_reader @@ -168,7 +168,7 @@ jobs: with: version: ${{ steps.tag_name.outputs.current_version }} path: ./CHANGELOG.md - if: startsWith('refs/tags/v', github.ref) + if: startsWith(github.ref, 'refs/tags/v') - name: Publish uses: svenstaro/upload-release-action@v2 @@ -178,4 +178,4 @@ jobs: tag: ${{ github.ref }} asset_name: miniserve-$tag-${{ matrix.release_name }} body: ${{ steps.changelog_reader.outputs.log_entry }} - if: startsWith('refs/tags/v', github.ref) + if: startsWith(github.ref, 'refs/tags/v') diff --git a/CHANGELOG.md b/CHANGELOG.md index c36c501..85bf11e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). <!-- next-header --> ## [Unreleased] - ReleaseDate +- Print QR codes on terminal [#524](https://github.com/svenstaro/miniserve/pull/524) (thanks @aliemjay) ## [0.16.0] - 2021-08-31 - Fix serving files with backslashes in their names [#578](https://github.com/svenstaro/miniserve/pull/578) (thanks @Jikstra) @@ -513,9 +513,9 @@ checksum = "4964518bd3b4a8190e832886cdc0da9794f12e8e6c1613a9e90ff331c4c8724b" [[package]] name = "cc" -version = "1.0.69" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2" +checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0" dependencies = [ "jobserver", ] @@ -663,9 +663,9 @@ dependencies = [ [[package]] name = "ctor" -version = "0.1.20" +version = "0.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e98e2ad1a782e33928b96fc3948e7c355e5af34ba4de7670fe8bac2a3b2006d" +checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" dependencies = [ "quote", "syn", @@ -1507,9 +1507,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76e97c412795abf6c24ba30055a8f20642ea57ca12875220b854cfa501bf1e48" +checksum = "74e768dff5fb39a41b3bcd30bb25cf989706c90d028d1ad71971987aa309d535" dependencies = [ "autocfg", "num-integer", @@ -2290,9 +2290,9 @@ dependencies = [ [[package]] name = "siphasher" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729a25c17d72b06c68cb47955d44fda88ad2d3e7d77e025663fdd69b93dd71a1" +checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b" [[package]] name = "slab" @@ -2437,9 +2437,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.75" +version = "1.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f58f7e8eaa0009c5fec437aabf511bd9933e4b2d7407bd05273c01a8906ea7" +checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84" dependencies = [ "proc-macro2", "quote", @@ -2614,9 +2614,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" [[package]] name = "tokio" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92036be488bb6594459f2e03b60e42df6f937fe6ca5c5ffdcb539c6b84dc40f5" +checksum = "b4efe6fc2395938c8155973d7be49fe8d03a843726e285e100a8a383cc0154ce" dependencies = [ "autocfg", "bytes", @@ -2644,9 +2644,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1caa0b0c8d94a049db56b5acf8cba99dc0623aab1b26d5b5f5e2d945846b3592" +checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd" dependencies = [ "bytes", "futures-core", @@ -2706,9 +2706,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.13.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f6906492a7cd215bfa4cf595b600146ccfac0c79bcbd1f3000162af5e8b06" +checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" [[package]] name = "ucd-trie" diff --git a/src/main.rs b/src/main.rs index 4ea1154..133f320 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::<Vec<_>>() }; @@ -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::<Vec<_>>() + .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"); } @@ -331,3 +353,31 @@ async fn css() -> impl Responder { .insert_header(ContentType(mime::TEXT_CSS)) .message_body(css.into()) } + +// Prints to the console two inverted QrCodes side by side. +fn print_qr(qr: &QrCode) { + 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) => '▄', + (true, true) => '█', + }; + print!("{0}", c); + } + println!(); + } + println!(); +} |