aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/build-release-binaries.yml6
-rw-r--r--CHANGELOG.md1
-rw-r--r--Cargo.lock32
-rw-r--r--src/main.rs54
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)
diff --git a/Cargo.lock b/Cargo.lock
index 901e5d4..d0dfc80 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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!();
+}