aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcyqsimon <28627918+cyqsimon@users.noreply.github.com>2022-09-01 12:20:27 +0000
committercyqsimon <28627918+cyqsimon@users.noreply.github.com>2022-09-01 12:20:27 +0000
commitaa2dda7885a83354d1519eef62397b90189a9802 (patch)
tree6ec247f7a3b6568ba7c8f7ec8c9e6248f0bed48b
parentRemove leftover `dbg!` (diff)
downloadminiserve-aa2dda7885a83354d1519eef62397b90189a9802.tar.gz
miniserve-aa2dda7885a83354d1519eef62397b90189a9802.zip
Switch to `fast_qr` crate
Diffstat (limited to '')
-rw-r--r--Cargo.lock78
-rw-r--r--Cargo.toml5
-rw-r--r--data/style.scss3
-rw-r--r--src/consts.rs4
-rw-r--r--src/main.rs33
-rw-r--r--src/renderer.rs36
6 files changed, 29 insertions, 130 deletions
diff --git a/Cargo.lock b/Cargo.lock
index cc8d3f6..6b02de7 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -475,12 +475,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3"
[[package]]
-name = "bytemuck"
-version = "1.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2f5715e491b5a1598fc2bef5a606847b5dc1d48ea625bd3c02c00de8285591da"
-
-[[package]]
name = "byteorder"
version = "1.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -529,12 +523,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
-name = "checked_int_cast"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17cc5e6b5ab06331c33589842070416baa137e8b0eb912b008cfd4a78ada7919"
-
-[[package]]
name = "chrono"
version = "0.4.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -639,12 +627,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9e769b5c8c8283982a987c6e948e540254f1058d5a74b8794914d4ef5fc2a24"
[[package]]
-name = "color_quant"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
-
-[[package]]
name = "comrak"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -834,6 +816,15 @@ dependencies = [
]
[[package]]
+name = "fast_qr"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b798dfd6e29b85c0bcf434272db4cde0100ab4d82c5db0a4f422e77b30d0b4e4"
+dependencies = [
+ "wasm-bindgen",
+]
+
+[[package]]
name = "fastrand"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1096,7 +1087,7 @@ dependencies = [
"indexmap",
"lasso",
"num-bigint",
- "num-rational 0.4.1",
+ "num-rational",
"num-traits",
"once_cell",
"phf 0.9.0",
@@ -1292,20 +1283,6 @@ dependencies = [
]
[[package]]
-name = "image"
-version = "0.23.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24ffcb7e7244a9bf19d35bf2883b9c080c4ced3c07a9895572178cdb8f13f6a1"
-dependencies = [
- "bytemuck",
- "byteorder",
- "color_quant",
- "num-iter",
- "num-rational 0.3.2",
- "num-traits",
-]
-
-[[package]]
name = "indexmap"
version = "1.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1570,13 +1547,13 @@ dependencies = [
"clap_mangen",
"comrak",
"fake-tty",
+ "fast_qr",
"futures",
"get_if_addrs",
"grass",
"hex",
"http",
"httparse",
- "lazy_static",
"libflate",
"log",
"maud",
@@ -1586,7 +1563,6 @@ dependencies = [
"port_check",
"predicates",
"pretty_assertions",
- "qrcode",
"regex",
"reqwest",
"rstest",
@@ -1670,28 +1646,6 @@ dependencies = [
]
[[package]]
-name = "num-iter"
-version = "0.1.43"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
-dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
-name = "num-rational"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
-dependencies = [
- "autocfg",
- "num-integer",
- "num-traits",
-]
-
-[[package]]
name = "num-rational"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2086,16 +2040,6 @@ dependencies = [
]
[[package]]
-name = "qrcode"
-version = "0.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "16d2f1455f3630c6e5107b4f2b94e74d76dea80736de0981fd27644216cff57f"
-dependencies = [
- "checked_int_cast",
- "image",
-]
-
-[[package]]
name = "quote"
version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index b7eb520..1294a6d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -32,12 +32,12 @@ clap = { version = "3.2", features = ["derive", "cargo", "wrap_help"] }
clap_complete = "3.2.3"
clap_mangen = "0.1"
comrak = "0.14.0"
+fast_qr = "0.3.1"
futures = "0.3"
get_if_addrs = "0.5"
hex = "0.4"
http = "0.2"
httparse = "1"
-lazy_static = "1.4.0"
libflate = "1"
log = "0.4"
maud = "0.23"
@@ -45,8 +45,6 @@ mime = "0.3"
nanoid = "0.4"
percent-encoding = "2"
port_check = "0.1"
-qrcode = "0.12.0"
-regex = "1"
rustls = { version = "0.20", optional = true }
rustls-pemfile = { version = "1.0", optional = true }
serde = { version = "1", features = ["derive"] }
@@ -73,6 +71,7 @@ assert_cmd = "2"
assert_fs = "1"
predicates = "2"
pretty_assertions = "1.2"
+regex = "1"
reqwest = { version = "0.11", features = ["blocking", "multipart", "rustls-tls"], default-features = false }
rstest = "0.15"
select = "0.5"
diff --git a/data/style.scss b/data/style.scss
index 87ecc4c..fb76a9a 100644
--- a/data/style.scss
+++ b/data/style.scss
@@ -180,9 +180,6 @@ nav .qrcode {
nav .qrcode svg {
display: block;
- border: 0.3rem;
- border-style: solid;
- border-color: #ffffff;
}
nav .theme {
diff --git a/src/consts.rs b/src/consts.rs
index f10570a..1a105f7 100644
--- a/src/consts.rs
+++ b/src/consts.rs
@@ -1,4 +1,4 @@
-use qrcode::EcLevel;
+use fast_qr::ECL;
/// The error correction level to use for all QR code generation.
-pub const QR_EC_LEVEL: EcLevel = EcLevel::L;
+pub const QR_EC_LEVEL: ECL = ECL::L;
diff --git a/src/main.rs b/src/main.rs
index 558dabb..11193cc 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -12,8 +12,8 @@ use actix_web_httpauth::middleware::HttpAuthentication;
use anyhow::Result;
use clap::{crate_version, IntoApp, Parser};
use clap_complete::generate;
+use fast_qr::QRBuilder;
use log::{error, warn};
-use qrcode::QrCode;
use yansi::{Color, Paint};
mod archive;
@@ -240,13 +240,13 @@ async fn run(miniserve_config: MiniserveConfig) -> Result<(), ContextualError> {
.iter()
.filter(|url| !url.contains("//127.0.0.1:") && !url.contains("//[::1]:"))
{
- match QrCode::with_error_correction_level(url, consts::QR_EC_LEVEL) {
+ match QRBuilder::new(url.clone()).ecl(consts::QR_EC_LEVEL).build() {
Ok(qr) => {
println!("QR code for {}:", Color::Green.paint(url).bold());
- print_qr(&qr);
+ qr.print();
}
Err(e) => {
- error!("Failed to render QR to terminal: {}", e);
+ error!("Failed to render QR to terminal: {:?}", e);
}
};
}
@@ -352,28 +352,3 @@ async fn css() -> impl Responder {
.insert_header(ContentType(mime::TEXT_CSS))
.body(css)
}
-
-// Prints to the console a normal and an inverted QrCode side by side.
-fn print_qr(qr: &QrCode) {
- use qrcode::render::unicode::Dense1x2;
-
- let normal = qr
- .render()
- .quiet_zone(true)
- .dark_color(Dense1x2::Dark)
- .light_color(Dense1x2::Light)
- .build();
- let inverted = qr
- .render()
- .quiet_zone(true)
- .dark_color(Dense1x2::Light)
- .light_color(Dense1x2::Dark)
- .build();
- let codes = normal
- .lines()
- .zip(inverted.lines())
- .map(|(l, r)| format!("{} {}", l, r))
- .collect::<Vec<_>>()
- .join("\n");
- println!("{}", codes);
-}
diff --git a/src/renderer.rs b/src/renderer.rs
index 614672f..77b9eed 100644
--- a/src/renderer.rs
+++ b/src/renderer.rs
@@ -2,10 +2,10 @@ use actix_web::http::StatusCode;
use chrono::{DateTime, Utc};
use chrono_humanize::Humanize;
use clap::{crate_name, crate_version};
-use lazy_static::lazy_static;
+use fast_qr::convert::svg::SvgBuilder;
+use fast_qr::qr::QRCodeError;
+use fast_qr::QRBuilder;
use maud::{html, Markup, PreEscaped, DOCTYPE};
-use qrcode::{types::QrError, QrCode};
-use regex::Regex;
use std::time::SystemTime;
use strum::IntoEnumIterator;
@@ -229,27 +229,11 @@ pub fn raw(entries: Vec<Entry>, is_root: bool) -> Markup {
}
/// Renders the QR code SVG
-fn qr_code_svg(url: impl AsRef<str>, no_width_height_attr: bool) -> Result<String, QrError> {
- use qrcode::render::svg;
- let qr = QrCode::with_error_correction_level(url.as_ref(), consts::QR_EC_LEVEL)?;
- let mut svg = qr
- .render()
- .quiet_zone(false)
- .dark_color(svg::Color("#000000"))
- .light_color(svg::Color("#ffffff"))
- .build();
-
- if no_width_height_attr {
- // HACK: qrcode crate hard-codes height and width into SVG's attributes.
- // This behaviour may be undesirable because we want it to fit its HTML container.
- // The proper way to remove them is to use a XML parser, but regex is good enough for a
- // simple case like this.
- lazy_static! {
- static ref RE: Regex =
- Regex::new(r#"(?P<front><svg.+? )width=".+?" height=".+?"(?P<aft>.+?>)"#).unwrap();
- }
- svg = RE.replace(&svg, "$front$aft").to_string();
- }
+fn qr_code_svg(url: impl AsRef<str>, margin: usize) -> Result<String, QRCodeError> {
+ let qr = QRBuilder::new(url.as_ref().into())
+ .ecl(consts::QR_EC_LEVEL)
+ .build()?;
+ let svg = SvgBuilder::new().margin(margin).build_qr(qr);
Ok(svg)
}
@@ -338,9 +322,9 @@ fn qr_spoiler(show_qrcode: bool, content: impl AsRef<str>) -> Markup {
"QR code"
}
div.qrcode #qrcode {
- @match qr_code_svg(content, true) {
+ @match qr_code_svg(content, 1) {
Ok(svg) => (PreEscaped(svg)),
- Err(err) => (format!("QR generation error: {}", err)),
+ Err(err) => (format!("QR generation error: {:?}", err)),
}
}
}