use qrcode::render::unicode::Dense1x2;
use qrcode::QrCode;
pub(super) fn render_for_terminal(data: &str, unicode_symbols: bool) -> Option<Vec<String>> {
if !unicode_symbols {
return None;
}
let code = QrCode::new(data.as_bytes()).ok()?;
let rendered = code
.render::<Dense1x2>()
.module_dimensions(1, 1)
.dark_color(Dense1x2::Dark)
.light_color(Dense1x2::Light)
.build();
Some(rendered.lines().map(|l| l.to_string()).collect())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn render_returns_none_when_unicode_disabled() {
assert!(render_for_terminal("https://example.com", false).is_none());
}
#[test]
fn render_produces_non_empty_block_for_short_url() {
let lines = render_for_terminal("https://acs.atomgit.com/s/AbC123", true)
.expect("Unicode-capable render must succeed for a short URL");
assert!(
lines.len() >= 8,
"expected at least 8 rows, got {}: {:#?}",
lines.len(),
lines
);
for (i, row) in lines.iter().enumerate() {
assert!(!row.is_empty(), "row {i} must not be empty");
}
}
#[test]
fn render_rows_have_uniform_char_width() {
let lines =
render_for_terminal("https://example.com", true).expect("render must succeed");
let first = lines[0].chars().count();
for (i, row) in lines.iter().enumerate() {
assert_eq!(
row.chars().count(),
first,
"row {i} char-width differs from row 0 ({first}): {row:?}"
);
}
}
}