use qrcode::{render::svg, types::QrError, EcLevel, QrCode};
pub fn qrcode(text: String) -> Result<String, QrError> {
let levels = [EcLevel::H, EcLevel::Q, EcLevel::M, EcLevel::L];
let mut result: Result<QrCode, QrError> = Result::Err(QrError::DataTooLong);
for ec_level in levels.iter() {
debug!("Trying EC level {:?}", *ec_level);
result = QrCode::with_error_correction_level(text.clone(), *ec_level);
if result.is_ok() {
break;
}
}
let code = result?;
info!("QR code EC level: {:?}", code.error_correction_level());
info!("QR code version: {:?}", code.version());
let image = code
.render()
.min_dimensions(256, 256)
.dark_color(svg::Color("#000000"))
.light_color(svg::Color("#ffffff"))
.quiet_zone(false)
.build();
Ok(image)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_svg_qrcode() {
let svg = qrcode(String::from("Some value")).unwrap();
assert_eq!(
svg,
String::from(include_str!("../../tests/data/some_value.svg")).trim()
);
}
#[test]
fn test_input_too_large() {
let result = qrcode(String::from(include_str!("../../tests/data/too_large.txt")));
assert!(result.is_err());
}
}