use crate::geometry::Location;
use crate::segment::{Mode, Segment};
use crate::symbology::Symbology;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum SymbolMeta {
Qr(crate::codes::qr::QrMeta),
Ean(crate::codes::ean::EanMeta),
Code39(crate::codes::code39::Code39Meta),
Code93(crate::codes::code93::Code93Meta),
Code11(crate::codes::code11::Code11Meta),
Code128(crate::codes::code128::Code128Meta),
Itf(crate::codes::itf::ItfMeta),
TwoOf5(crate::codes::twoof5::TwoOf5Meta),
Codabar(crate::codes::codabar::CodabarMeta),
Msi(crate::codes::msi::MsiMeta),
Telepen(crate::codes::telepen::TelepenMeta),
Pharmacode(crate::codes::pharmacode::PharmacodeMeta),
DataBar(crate::codes::databar::DataBarMeta),
Pdf417(crate::codes::pdf417::Pdf417Meta),
DataMatrix(crate::codes::datamatrix::DataMatrixMeta),
Aztec(crate::codes::aztec::AztecMeta),
MaxiCode(crate::codes::maxicode::MaxiCodeMeta),
MicroQr(crate::codes::microqr::MicroQrMeta),
Rmqr(crate::codes::rmqr::RmqrMeta),
Postal(crate::codes::postal::PostalMeta),
HanXin(crate::codes::hanxin::HanXinMeta),
GridMatrix(crate::codes::gridmatrix::GridMatrixMeta),
DotCode(crate::codes::dotcode::DotCodeMeta),
Code16k(crate::codes::code16k::Code16kMeta),
Code49(crate::codes::code49::Code49Meta),
CodablockF(crate::codes::codablockf::CodablockFMeta),
DxFilm(crate::codes::dxfilm::DxFilmMeta),
Generic,
}
#[derive(Debug, Clone, PartialEq)]
pub struct Symbol {
pub symbology: Symbology,
pub segments: Vec<Segment>,
pub meta: SymbolMeta,
pub location: Option<Location>,
}
impl Symbol {
pub fn new(symbology: Symbology, segments: Vec<Segment>, meta: SymbolMeta) -> Self {
Symbol {
symbology,
segments,
meta,
location: None,
}
}
pub fn payload_bytes(&self) -> Vec<u8> {
let mut out = Vec::new();
for seg in &self.segments {
if seg.mode.is_data() {
out.extend_from_slice(&seg.data);
}
}
out
}
pub fn text(&self) -> Option<String> {
String::from_utf8(self.payload_bytes()).ok()
}
pub fn modes(&self) -> Vec<Mode> {
self.segments.iter().map(|s| s.mode.clone()).collect()
}
}