use crate::gf28::GF28;
use crate::matrix::Matrix;
use crate::mode_encoder::prepare_data;
use crate::qr_spec::EcLevel;
use crate::reed::{interleave_blocks, BlockSpec, ReedSolomon};
fn generate_qr_code(text: &str, ec_level: EcLevel) -> Result<String, &'static str> {
let (buf, spec) = prepare_data(text, Some(ec_level))?;
let data_bytes = buf.to_bytes();
let gf = GF28::new();
let rs = ReedSolomon::new(&gf);
let block_spec = spec.to_block_spec();
let final_codewords = interleave_blocks(&data_bytes, &block_spec, &rs);
let mut matrix = Matrix::new(spec.version);
matrix.place_data_bits(&final_codewords);
let ec_str = match ec_level {
EcLevel::L => "L",
EcLevel::M => "M",
EcLevel::Q => "Q",
EcLevel::H => "H",
};
matrix.select_mask(ec_str);
Ok(matrix.render_ascii())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_version_1_qr_generation() {
let text = "https://amarch.vercel.app";
let result = generate_qr_code(text, EcLevel::M);
assert!(result.is_ok());
let ascii_qr = result.unwrap();
assert!(!ascii_qr.is_empty());
println!("Generated QR Code:\n{}", ascii_qr);
}
#[test]
fn test_numeric_mode_encoding() {
let text = "1234567890";
let result = generate_qr_code(text, EcLevel::L);
assert!(result.is_ok());
}
}