#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum BarcodeType {
Code39,
}
impl BarcodeType {
pub fn from_xfa_name(naam: &str) -> Option<Self> {
match naam.trim().to_ascii_lowercase().as_str() {
"code39" | "code3of9" => Some(Self::Code39),
_ => None,
}
}
}
const CODE39: &[(char, [bool; 9])] = &[
(
'0',
[false, false, false, true, true, false, true, false, false],
),
(
'1',
[true, false, false, true, false, false, false, false, true],
),
(
'2',
[false, false, true, true, false, false, false, false, true],
),
(
'3',
[true, false, true, true, false, false, false, false, false],
),
(
'4',
[false, false, false, true, true, false, false, false, true],
),
(
'5',
[true, false, false, true, true, false, false, false, false],
),
(
'6',
[false, false, true, true, true, false, false, false, false],
),
(
'7',
[false, false, false, true, false, false, true, false, true],
),
(
'8',
[true, false, false, true, false, false, true, false, false],
),
(
'9',
[false, false, true, true, false, false, true, false, false],
),
(
'A',
[true, false, false, false, false, true, false, false, true],
),
(
'B',
[false, false, true, false, false, true, false, false, true],
),
(
'C',
[true, false, true, false, false, true, false, false, false],
),
(
'D',
[false, false, false, false, true, true, false, false, true],
),
(
'E',
[true, false, false, false, true, true, false, false, false],
),
(
'F',
[false, false, true, false, true, true, false, false, false],
),
(
'G',
[false, false, false, false, false, true, true, false, true],
),
(
'H',
[true, false, false, false, false, true, true, false, false],
),
(
'I',
[false, false, true, false, false, true, true, false, false],
),
(
'J',
[false, false, false, false, true, true, true, false, false],
),
(
'K',
[true, false, false, false, false, false, false, true, true],
),
(
'L',
[false, false, true, false, false, false, false, true, true],
),
(
'M',
[true, false, true, false, false, false, false, true, false],
),
(
'N',
[false, false, false, false, true, false, false, true, true],
),
(
'O',
[true, false, false, false, true, false, false, true, false],
),
(
'P',
[false, false, true, false, true, false, false, true, false],
),
(
'Q',
[false, false, false, false, false, false, true, true, true],
),
(
'R',
[true, false, false, false, false, false, true, true, false],
),
(
'S',
[false, false, true, false, false, false, true, true, false],
),
(
'T',
[false, false, false, false, true, false, true, true, false],
),
(
'U',
[true, true, false, false, false, false, false, false, true],
),
(
'V',
[false, true, true, false, false, false, false, false, true],
),
(
'W',
[true, true, true, false, false, false, false, false, false],
),
(
'X',
[false, true, false, false, true, false, false, false, true],
),
(
'Y',
[true, true, false, false, true, false, false, false, false],
),
(
'Z',
[false, true, true, false, true, false, false, false, false],
),
(
'-',
[false, true, false, false, false, false, true, false, true],
),
(
'.',
[true, true, false, false, false, false, true, false, false],
),
(
' ',
[false, true, true, false, false, false, true, false, false],
),
(
'$',
[false, true, false, true, false, true, false, false, false],
),
(
'/',
[false, true, false, true, false, false, false, true, false],
),
(
'+',
[false, true, false, false, false, true, false, true, false],
),
(
'%',
[false, false, false, true, false, true, false, true, false],
),
(
'*',
[false, true, false, false, true, false, true, false, false],
),
];
fn patroon(c: char) -> Option<[bool; 9]> {
let boven = c.to_ascii_uppercase();
CODE39.iter().find(|(k, _)| *k == boven).map(|(_, p)| *p)
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct Element {
pub is_bar: bool,
pub modules: u8,
}
pub fn encode_code39(tekst: &str) -> Option<Vec<Element>> {
let met_bookends: String = format!("*{}*", tekst.to_ascii_uppercase());
let mut uit = Vec::new();
for (i, c) in met_bookends.chars().enumerate() {
if c == '*' && i != 0 && i != met_bookends.chars().count() - 1 {
return None;
}
let p = patroon(c)?;
for (j, breed) in p.iter().enumerate() {
uit.push(Element {
is_bar: j % 2 == 0,
modules: if *breed { 3 } else { 1 },
});
}
uit.push(Element {
is_bar: false,
modules: 1,
});
}
uit.pop(); Some(uit)
}
pub fn total_modules(elementen: &[Element]) -> u32 {
elementen.iter().map(|e| u32::from(e.modules)).sum()
}