use crate::encoding::{BitMatrix, Encoded, LinearPattern, Postal4Pattern, StackedPattern};
use crate::error::Error;
use crate::options::Options;
use crate::symbology::Symbology;
mod png;
mod svg;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Format {
Svg,
Png,
}
pub fn render_svg(symbology: Symbology, data: &str, opts: &Options) -> Result<String, Error> {
let encoded = symbology.encode(data, opts)?;
Ok(match encoded {
Encoded::Linear(p) => svg::render_linear(&p, opts),
Encoded::Matrix(m) => svg::render_matrix(&m, opts),
Encoded::Postal4State(p) => svg::render_postal4(&p, opts),
Encoded::Stacked(p) => svg::render_stacked(&p, opts),
Encoded::Dots(d) => svg::render_dots(&d, opts),
Encoded::Hex(s) => svg::render_hex(&s, opts),
Encoded::ColorMatrix(m) => svg::render_color_matrix(&m, opts),
})
}
pub fn render_png(symbology: Symbology, data: &str, opts: &Options) -> Result<Vec<u8>, Error> {
let encoded = symbology.encode(data, opts)?;
match encoded {
Encoded::Linear(p) => png::render_linear(&p, opts),
Encoded::Matrix(m) => png::render_matrix(&m, opts),
Encoded::Postal4State(p) => png::render_postal4(&p, opts),
Encoded::Stacked(p) => png::render_stacked(&p, opts),
Encoded::Dots(d) => png::render_dots(&d, opts),
Encoded::Hex(s) => png::render_hex(&s, opts),
Encoded::ColorMatrix(m) => png::render_color_matrix(&m, opts),
}
}
#[allow(dead_code)]
pub(crate) fn iter_linear_runs(p: &LinearPattern) -> impl Iterator<Item = (u32, bool)> + '_ {
p.bars
.iter()
.enumerate()
.map(|(i, &width)| (u32::from(width), i % 2 == 0))
}
#[allow(dead_code)]
pub(crate) fn matrix_dimensions(m: &BitMatrix) -> (usize, usize) {
(m.width(), m.height())
}
#[allow(dead_code)]
pub(crate) fn postal4_bar_count(p: &Postal4Pattern) -> usize {
p.len()
}
#[allow(dead_code)]
pub(crate) fn stacked_row_count(p: &StackedPattern) -> usize {
p.height_rows()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn helper_accessors_return_expected_values() {
use crate::encoding::{Bar4State, LinearPattern, Postal4Pattern};
let lp = LinearPattern {
bars: vec![1, 2, 3, 4],
text: None,
};
let runs: Vec<(u32, bool)> = iter_linear_runs(&lp).collect();
assert_eq!(
runs,
vec![(1, true), (2, false), (3, true), (4, false)],
"bar/space alternation must start with bar (i==0)"
);
let m = BitMatrix::new(7, 4);
assert_eq!(matrix_dimensions(&m), (7, 4));
let p = Postal4Pattern {
bars: vec![Bar4State::Full; 5],
text: None,
};
assert_eq!(postal4_bar_count(&p), 5);
let sp = StackedPattern::new(
vec![
LinearPattern {
bars: vec![1, 2, 3],
text: None,
},
LinearPattern {
bars: vec![3, 2, 1],
text: None,
},
],
None,
)
.unwrap();
assert_eq!(stacked_row_count(&sp), 2);
}
}