use crate::{
BarcodeFormat, Binarizer, BinaryBitmap, DecodeHints, ImmutableReader, RXingResult,
RXingResultMetadataType, RXingResultMetadataValue, Reader,
common::{DecoderRXingResult, DetectorRXingResult, Result},
exceptions::Exceptions,
};
use super::{decoder, detector::Detector};
#[derive(Default)]
pub struct AztecReader;
impl Reader for AztecReader {
fn decode<B: Binarizer>(&mut self, image: &mut BinaryBitmap<B>) -> Result<RXingResult> {
self.decode_with_hints(image, &DecodeHints::default())
}
fn decode_with_hints<B: Binarizer>(
&mut self,
image: &mut BinaryBitmap<B>,
hints: &DecodeHints,
) -> Result<RXingResult> {
self.internal_decode_with_hints(image, hints)
}
}
impl ImmutableReader for AztecReader {
fn immutable_decode_with_hints<B: Binarizer>(
&self,
image: &mut BinaryBitmap<B>,
hints: &DecodeHints,
) -> Result<RXingResult> {
self.internal_decode_with_hints(image, hints)
}
}
impl AztecReader {
fn internal_decode_with_hints<B: Binarizer>(
&self,
image: &mut BinaryBitmap<B>,
hints: &DecodeHints,
) -> Result<RXingResult> {
let mut detector = Detector::new(image.get_black_matrix());
let detectorRXingResult = if let Ok(det) = detector.detect(false) {
det
} else if let Ok(det) = detector.detect(true) {
det
} else {
return Err(Exceptions::NOT_FOUND);
};
let points = detectorRXingResult.getPoints();
let decoderRXingResult: DecoderRXingResult = decoder::decode(&detectorRXingResult)?;
if let Some(cb) = &hints.NeedResultPointCallback {
for point in points {
cb(*point);
}
}
let mut result = RXingResult::new_complex(
decoderRXingResult.getText(),
decoderRXingResult.getRawBytes().clone(),
decoderRXingResult.getNumBits(),
points.to_vec(),
BarcodeFormat::AZTEC,
chrono::Utc::now().timestamp_millis() as u128,
);
let byteSegments = decoderRXingResult.getByteSegments();
if !byteSegments.is_empty() {
result.putMetadata(
RXingResultMetadataType::BYTE_SEGMENTS,
RXingResultMetadataValue::ByteSegments(byteSegments.clone()),
);
}
let ecLevel = decoderRXingResult.getECLevel();
if !ecLevel.is_empty() {
result.putMetadata(
RXingResultMetadataType::ERROR_CORRECTION_LEVEL,
RXingResultMetadataValue::ErrorCorrectionLevel(ecLevel.to_owned()),
);
}
result.putMetadata(
RXingResultMetadataType::SYMBOLOGY_IDENTIFIER,
RXingResultMetadataValue::SymbologyIdentifier(format!(
"]z{}",
decoderRXingResult.getSymbologyModifier()
)),
);
Ok(result)
}
}