QRCode Generator in Rust
New Series in Rust 🦀
Today I posted a new video on YouTube (PLEASE SUBSCRIBE 🙌)
in Portuguese talking about how to develop a QR Code generator and here I’ll leave the step by step in case you’re interested in seeing how I did it, but the instructions should be in English:
First, I started by choosing a very simple library that provides everything we need qrcode, the name is quite self-explanatory, and the rest of the code isn’t very complicated. I started by creating my new package:
cargo new rust-qrcode-generator
Inside it, I added the new lib to Cargo.toml:
[package]
name = "rust-qrcode-generator"
version = "0.1.0"``
edition = "2021"
[dependencies]
qrcode = "0.13"
Then I ran cargo build
to install our library.
After that, I started with the imports we need in our main.rs:
use qrcode::QrCode;
use qrcode::render::unicode;
use std::io;
After that, I started with the input part, and it’s important to note that we need std::io
to be able to use the read_line
function and actually get the data and confirmation of what we want to generate:
fn main() {
println!("Enter the string to generate QR code:");
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let input = input.trim();
println!("Do you want to generate a QR code for the following input? (y/n)");
let mut confirmation = String::new();
io::stdin()
.read_line(&mut confirmation)
.expect("Failed to read line");
}
After that, I started with the logic we’ll use, which is to check if we really want to create a new QR Code and draw it using the qrcode lib, note that we start by defining a unicode to segment the dots and then we start tracing the separations between dark and light, after that we build it and actually return the new image:
if confirmation.trim().to_lowercase() == "y" {
let code = QrCode::new(input).unwrap();
let image = code
.render::<unicode::Dense1x2>()
.dark_color(unicode::Dense1x2::Light)
.light_color(unicode::Dense1x2::Dark)
.build();
println!("{}", image);
} else {
println!("QR code generation canceled.");
}
The entire code looks like this:
use qrcode::QrCode;
use qrcode::render::unicode;
use std::io;
fn main() {
println!("Enter the string to generate QR code:");
let mut input = String::new();
io::stdin().read_line(&mut input).expect("Failed to read line");
let input = input.trim();
println!("Do you want to generate a QR code for the following input? (y/n)");
let mut confirmation = String::new();
io::stdin()
.read_line(&mut confirmation)
.expect("Failed to read line");
if confirmation.trim().to_lowercase() == "y" {
let code = QrCode::new(input).unwrap();
let image = code
.render::<unicode::Dense1x2>()
.dark_color(unicode::Dense1x2::Light)
.light_color(unicode::Dense1x2::Dark)
.build();
println!("{}", image);
} else {
println!("QR code generation canceled.");
}
}
And below is the desired output:
Well, that’s it! See ya! 🙃