refactor to use exception helper factories

This commit is contained in:
Vukašin Stepanović
2023-02-15 10:46:13 +00:00
parent 3e27279dc8
commit 722ce78fd0
132 changed files with 966 additions and 1132 deletions

View File

@@ -36,9 +36,9 @@ impl BitMatrixParser {
pub fn new(bit_matrix: BitMatrix) -> Result<Self, Exceptions> {
let dimension = bit_matrix.getHeight();
if dimension < 21 || (dimension & 0x03) != 1 {
Err(Exceptions::FormatException(Some(format!(
Err(Exceptions::format(format!(
"{dimension} < 21 || ({dimension} % 0x03) != 1"
))))
)))
} else {
Ok(Self {
bitMatrix: bit_matrix,
@@ -61,7 +61,7 @@ impl BitMatrixParser {
return self
.parsedFormatInfo
.as_ref()
.ok_or(Exceptions::ParseException(None));
.ok_or(Exceptions::parseEmpty());
}
// Read top-left format info bits
@@ -94,7 +94,7 @@ impl BitMatrixParser {
self.parsedFormatInfo
.as_ref()
.ok_or(Exceptions::FormatException(None))
.ok_or(Exceptions::formatEmpty())
}
/**
@@ -146,7 +146,7 @@ impl BitMatrixParser {
return Ok(theParsedVersion);
}
}
Err(Exceptions::FormatException(None))
Err(Exceptions::formatEmpty())
}
fn copyBit(&self, i: u32, j: u32, versionBits: u32) -> u32 {
@@ -227,7 +227,7 @@ impl BitMatrixParser {
}
if resultOffset != version.getTotalCodewords() as usize {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
Ok(result)
}

View File

@@ -55,7 +55,7 @@ impl DataBlock {
ecLevel: ErrorCorrectionLevel,
) -> Result<Vec<Self>, Exceptions> {
if rawCodewords.len() as u32 != version.getTotalCodewords() {
return Err(Exceptions::IllegalArgumentException(None));
return Err(Exceptions::illegalArgumentEmpty());
}
// Figure out the number and size of data blocks used by this version and

View File

@@ -228,9 +228,9 @@ impl TryFrom<u8> for DataMask {
5 => Ok(DataMask::DATA_MASK_101),
6 => Ok(DataMask::DATA_MASK_110),
7 => Ok(DataMask::DATA_MASK_111),
_ => Err(Exceptions::IllegalArgumentException(Some(format!(
_ => Err(Exceptions::illegalArgument(format!(
"{value} is not between 0 and 7"
)))),
))),
}
}
}

View File

@@ -78,10 +78,10 @@ pub fn decode(
}
Mode::STRUCTURED_APPEND => {
if bits.available() < 16 {
return Err(Exceptions::FormatException(Some(format!(
return Err(Exceptions::format(format!(
"Mode::Structured append expected bits.available() < 16, found bits of {}",
bits.available()
))));
)));
}
// sequence number and parity is added later to the result metadata
// Read next 8 bits (symbol sequence #) and 8 bits (parity data), then continue
@@ -93,9 +93,7 @@ pub fn decode(
let value = parseECIValue(&mut bits)?;
currentCharacterSetECI = CharacterSetECI::getCharacterSetECIByValue(value).ok();
if currentCharacterSetECI.is_none() {
return Err(Exceptions::FormatException(Some(format!(
"Value of {value} not valid"
))));
return Err(Exceptions::format(format!("Value of {value} not valid")));
}
}
Mode::HANZI => {
@@ -132,7 +130,7 @@ pub fn decode(
currentCharacterSetECI,
hints,
)?,
_ => return Err(Exceptions::FormatException(None)),
_ => return Err(Exceptions::formatEmpty()),
}
}
}
@@ -181,7 +179,7 @@ fn decodeHanziSegment(
) -> Result<(), Exceptions> {
// Don't crash trying to read more bits than we have available.
if count * 13 > bits.available() {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
// Each character will require 2 bytes. Read the characters as 2-byte pairs
@@ -207,13 +205,11 @@ fn decodeHanziSegment(
count -= 1;
}
let gb_encoder = encoding::label::encoding_from_whatwg_label("GBK")
.ok_or(Exceptions::IllegalStateException(None))?;
let gb_encoder =
encoding::label::encoding_from_whatwg_label("GBK").ok_or(Exceptions::illegalStateEmpty())?;
let encode_string = gb_encoder
.decode(&buffer, encoding::DecoderTrap::Strict)
.map_err(|e| {
Exceptions::ParseException(Some(format!("unable to decode buffer {buffer:?}: {e}")))
})?;
.map_err(|e| Exceptions::parse(format!("unable to decode buffer {buffer:?}: {e}")))?;
result.push_str(&encode_string);
Ok(())
}
@@ -227,7 +223,7 @@ fn decodeKanjiSegment(
) -> Result<(), Exceptions> {
// Don't crash trying to read more bits than we have available.
if count * 13 > bits.available() {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
// Each character will require 2 bytes. Read the characters as 2-byte pairs
@@ -256,8 +252,7 @@ fn decodeKanjiSegment(
let encoder = {
let _ = currentCharacterSetECI;
let _ = hints;
encoding::label::encoding_from_whatwg_label("SJIS")
.ok_or(Exceptions::FormatException(None))?
encoding::label::encoding_from_whatwg_label("SJIS").ok_or(Exceptions::formatEmpty())?
};
#[cfg(feature = "allow_forced_iso_ied_18004_compliance")]
@@ -270,15 +265,12 @@ fn decodeKanjiSegment(
encoding::all::ISO_8859_1
}
} else {
encoding::label::encoding_from_whatwg_label("SJIS")
.ok_or(Exceptions::FormatException(None))?
encoding::label::encoding_from_whatwg_label("SJIS").ok_or(Exceptions::formatEmpty())?
};
let encode_string = encoder
.decode(&buffer, encoding::DecoderTrap::Strict)
.map_err(|e| {
Exceptions::ParseException(Some(format!("unable to decode buffer {buffer:?}: {e}")))
})?;
.map_err(|e| Exceptions::parse(format!("unable to decode buffer {buffer:?}: {e}")))?;
result.push_str(&encode_string);
@@ -295,7 +287,7 @@ fn decodeByteSegment(
) -> Result<(), Exceptions> {
// Don't crash trying to read more bits than we have available.
if 8 * count > bits.available() {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
let mut readBytes = vec![0u8; count];
@@ -311,8 +303,7 @@ fn decodeByteSegment(
// give a hint.
{
#[cfg(not(feature = "allow_forced_iso_ied_18004_compliance"))]
StringUtils::guessCharset(&readBytes, hints)
.ok_or(Exceptions::IllegalStateException(None))?
StringUtils::guessCharset(&readBytes, hints).ok_or(Exceptions::illegalStateEmpty())?
}
#[cfg(feature = "allow_forced_iso_ied_18004_compliance")]
@@ -327,14 +318,14 @@ fn decodeByteSegment(
CharacterSetECI::getCharset(
currentCharacterSetECI
.as_ref()
.ok_or(Exceptions::IllegalStateException(None))?,
.ok_or(Exceptions::illegalStateEmpty())?,
)
};
let encode_string = if currentCharacterSetECI.is_some()
&& currentCharacterSetECI
.as_ref()
.ok_or(Exceptions::IllegalStateException(None))?
.ok_or(Exceptions::illegalStateEmpty())?
== &CharacterSetECI::Cp437
{
{
@@ -346,11 +337,7 @@ fn decodeByteSegment(
} else {
encoding
.decode(&readBytes, encoding::DecoderTrap::Strict)
.map_err(|e| {
Exceptions::ParseException(Some(format!(
"unable to decode buffer {readBytes:?}: {e}"
)))
})?
.map_err(|e| Exceptions::parse(format!("unable to decode buffer {readBytes:?}: {e}")))?
};
result.push_str(&encode_string);
@@ -361,13 +348,13 @@ fn decodeByteSegment(
fn toAlphaNumericChar(value: u32) -> Result<char, Exceptions> {
if value as usize >= ALPHANUMERIC_CHARS.len() {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
ALPHANUMERIC_CHARS
.chars()
.nth(value as usize)
.ok_or(Exceptions::FormatException(None))
.ok_or(Exceptions::formatEmpty())
}
fn decodeAlphanumericSegment(
@@ -381,7 +368,7 @@ fn decodeAlphanumericSegment(
let mut count = count;
while count > 1 {
if bits.available() < 11 {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
let nextTwoCharsBits = bits.readBits(11)?;
result.push(toAlphaNumericChar(nextTwoCharsBits / 45)?);
@@ -391,7 +378,7 @@ fn decodeAlphanumericSegment(
if count == 1 {
// special case: one character left
if bits.available() < 6 {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
result.push(toAlphaNumericChar(bits.readBits(6)?)?);
}
@@ -402,14 +389,14 @@ fn decodeAlphanumericSegment(
if result
.chars()
.nth(i)
.ok_or(Exceptions::IndexOutOfBoundsException(None))?
.ok_or(Exceptions::indexOutOfBoundsEmpty())?
== '%'
{
if i < result.len() - 1
&& result
.chars()
.nth(i + 1)
.ok_or(Exceptions::IndexOutOfBoundsException(None))?
.ok_or(Exceptions::indexOutOfBoundsEmpty())?
== '%'
{
// %% is rendered as %
@@ -435,11 +422,11 @@ fn decodeNumericSegment(
while count >= 3 {
// Each 10 bits encodes three digits
if bits.available() < 10 {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
let threeDigitsBits = bits.readBits(10)?;
if threeDigitsBits >= 1000 {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
result.push(toAlphaNumericChar(threeDigitsBits / 100)?);
result.push(toAlphaNumericChar((threeDigitsBits / 10) % 10)?);
@@ -449,22 +436,22 @@ fn decodeNumericSegment(
if count == 2 {
// Two digits left over to read, encoded in 7 bits
if bits.available() < 7 {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
let twoDigitsBits = bits.readBits(7)?;
if twoDigitsBits >= 100 {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
result.push(toAlphaNumericChar(twoDigitsBits / 10)?);
result.push(toAlphaNumericChar(twoDigitsBits % 10)?);
} else if count == 1 {
// One digit left over to read
if bits.available() < 4 {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
let digitBits = bits.readBits(4)?;
if digitBits >= 10 {
return Err(Exceptions::FormatException(None));
return Err(Exceptions::formatEmpty());
}
result.push(toAlphaNumericChar(digitBits)?);
}
@@ -489,5 +476,5 @@ fn parseECIValue(bits: &mut BitSource) -> Result<u32, Exceptions> {
return Ok(((firstByte & 0x1F) << 16) | secondThirdBytes);
}
Err(Exceptions::FormatException(None))
Err(Exceptions::formatEmpty())
}

View File

@@ -47,9 +47,9 @@ impl ErrorCorrectionLevel {
1 => Ok(Self::L),
2 => Ok(Self::H),
3 => Ok(Self::Q),
_ => Err(Exceptions::IllegalArgumentException(Some(format!(
_ => Err(Exceptions::illegalArgument(format!(
"{bits} is not a valid bit selection"
)))),
))),
}
}
@@ -109,8 +109,8 @@ impl FromStr for ErrorCorrectionLevel {
return number_possible.try_into();
}
return Err(Exceptions::IllegalArgumentException(Some(format!(
return Err(Exceptions::illegalArgument(format!(
"could not parse {s} into an ec level"
))));
)));
}
}

View File

@@ -68,9 +68,7 @@ impl Mode {
{
Ok(Self::HANZI)
}
_ => Err(Exceptions::IllegalArgumentException(Some(format!(
"{bits} is not valid"
)))),
_ => Err(Exceptions::illegalArgument(format!("{bits} is not valid"))),
}
}

View File

@@ -129,7 +129,7 @@ pub fn decode_bitmatrix_with_hints(
if let Some(fe) = fe {
Err(fe)
} else {
Err(ce.unwrap_or(Exceptions::ChecksumException(None)))
Err(ce.unwrap_or(Exceptions::checksumEmpty()))
}
}
_ => Err(er),

View File

@@ -101,18 +101,16 @@ impl Version {
dimension: u32,
) -> Result<&'static Version, Exceptions> {
if dimension % 4 != 1 {
return Err(Exceptions::FormatException(Some(
"dimension incorrect".to_owned(),
)));
return Err(Exceptions::format("dimension incorrect".to_owned()));
}
Self::getVersionForNumber((dimension - 17) / 4)
}
pub fn getVersionForNumber(versionNumber: u32) -> Result<&'static Version, Exceptions> {
if !(1..=40).contains(&versionNumber) {
return Err(Exceptions::IllegalArgumentException(Some(
return Err(Exceptions::illegalArgument(
"version out of spec".to_owned(),
)));
));
}
Ok(&VERSIONS[versionNumber as usize - 1])
}
@@ -140,7 +138,7 @@ impl Version {
return Self::getVersionForNumber(bestVersion);
}
// If we didn't find a close enough match, fail
Err(Exceptions::NotFoundException(None))
Err(Exceptions::notFoundEmpty())
}
/**

View File

@@ -161,9 +161,9 @@ impl AlignmentPatternFinder {
Ok(*(self
.possibleCenters
.get(0)
.ok_or(Exceptions::IndexOutOfBoundsException(None)))?)
.ok_or(Exceptions::indexOutOfBoundsEmpty()))?)
} else {
Err(Exceptions::NotFoundException(None))
Err(Exceptions::notFoundEmpty())
}
}

View File

@@ -696,7 +696,7 @@ impl<'a> FinderPatternFinder<'_> {
let startSize = self.possibleCenters.len();
if startSize < 3 {
// Couldn't find enough finder patterns
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
self.possibleCenters
@@ -713,19 +713,19 @@ impl<'a> FinderPatternFinder<'_> {
for i in 0..self.possibleCenters.len() {
let Some(fpi) = self.possibleCenters.get(i) else {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
};
let minModuleSize = fpi.getEstimatedModuleSize();
for j in (i + 1)..(self.possibleCenters.len() - 1) {
let Some(fpj) = self.possibleCenters.get(j) else {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
};
let squares0 = Self::squaredDistance(fpi, fpj);
for k in (j + 1)..(self.possibleCenters.len()) {
let Some(fpk) = self.possibleCenters.get(k) else {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
};
let maxModuleSize = fpk.getEstimatedModuleSize();
if maxModuleSize > minModuleSize * 1.4 {
@@ -777,16 +777,16 @@ impl<'a> FinderPatternFinder<'_> {
}
if distortion == f64::MAX {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
if bestPatterns[0].is_none() {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
let p1 = bestPatterns[0].ok_or(Exceptions::NotFoundException(None))?;
let p2 = bestPatterns[1].ok_or(Exceptions::NotFoundException(None))?;
let p3 = bestPatterns[2].ok_or(Exceptions::NotFoundException(None))?;
let p1 = bestPatterns[0].ok_or(Exceptions::notFoundEmpty())?;
let p2 = bestPatterns[1].ok_or(Exceptions::notFoundEmpty())?;
let p3 = bestPatterns[2].ok_or(Exceptions::notFoundEmpty())?;
Ok([p1, p2, p3])
}

View File

@@ -105,7 +105,7 @@ impl<'a> Detector<'_> {
let moduleSize = self.calculateModuleSize(topLeft, topRight, bottomLeft);
if moduleSize < 1.0 {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
let dimension = Self::computeDimension(topLeft, topRight, bottomLeft, moduleSize)?;
let provisionalVersion = Version::getProvisionalVersionForDimension(dimension)?;
@@ -147,7 +147,7 @@ impl<'a> Detector<'_> {
alignmentPattern.as_ref(),
dimension,
)
.ok_or(Exceptions::NotFoundException(None))?;
.ok_or(Exceptions::notFoundEmpty())?;
let bits = Detector::sampleGrid(self.image, &transform, dimension)?;
@@ -160,7 +160,7 @@ impl<'a> Detector<'_> {
if alignmentPattern.is_some() {
points.push(
alignmentPattern
.ok_or(Exceptions::NotFoundException(None))?
.ok_or(Exceptions::notFoundEmpty())?
.into_rxing_result_point(),
)
}
@@ -241,7 +241,7 @@ impl<'a> Detector<'_> {
match dimension & 0x03 {
0 => dimension += 1,
2 => dimension -= 1,
3 => return Err(Exceptions::NotFoundException(None)),
3 => return Err(Exceptions::notFoundEmpty()),
_ => {}
}
Ok(dimension as u32)
@@ -428,13 +428,13 @@ impl<'a> Detector<'_> {
let alignmentAreaLeftX = 0.max(estAlignmentX as i32 - allowance as i32) as u32;
let alignmentAreaRightX = (self.image.getWidth() - 1).min(estAlignmentX + allowance);
if ((alignmentAreaRightX - alignmentAreaLeftX) as f32) < overallEstModuleSize * 3.0 {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
let alignmentAreaTopY = 0.max(estAlignmentY as i32 - allowance as i32) as u32;
let alignmentAreaBottomY = (self.image.getHeight() - 1).min(estAlignmentY + allowance);
if alignmentAreaBottomY - alignmentAreaTopY < overallEstModuleSize as u32 * 3 {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
let mut alignmentFinder = AlignmentPatternFinder::new(

View File

@@ -174,9 +174,9 @@ pub fn getDataMaskBit(maskPattern: u32, x: u32, y: u32) -> Result<bool, Exceptio
((temp % 3) + ((y + x) & 0x1)) & 0x1
}
_ => {
return Err(Exceptions::IllegalArgumentException(Some(format!(
return Err(Exceptions::illegalArgument(format!(
"Invalid mask pattern: {maskPattern}"
))))
)))
}
};
// switch (maskPattern) {

View File

@@ -278,11 +278,11 @@ pub fn embedDataBits(
}
// All bits should be consumed.
if bitIndex != dataBits.getSize() {
return Err(Exceptions::WriterException(Some(format!(
return Err(Exceptions::writer(format!(
"Not all bits consumed: {}/{}",
bitIndex,
dataBits.getSize()
))));
)));
}
Ok(())
}
@@ -323,9 +323,7 @@ pub fn findMSBSet(value: u32) -> u32 {
// operations. We don't care if coefficients are positive or negative.
pub fn calculateBCHCode(value: u32, poly: u32) -> Result<u32, Exceptions> {
if poly == 0 {
return Err(Exceptions::IllegalArgumentException(Some(
"0 polynomial".to_owned(),
)));
return Err(Exceptions::illegalArgument("0 polynomial".to_owned()));
}
let mut value = value;
// If poly is "1 1111 0010 0101" (version info poly), msbSetInPoly is 13. We'll subtract 1
@@ -349,9 +347,7 @@ pub fn makeTypeInfoBits(
bits: &mut BitArray,
) -> Result<(), Exceptions> {
if !QRCode::isValidMaskPattern(maskPattern as i32) {
return Err(Exceptions::WriterException(Some(
"Invalid mask pattern".to_owned(),
)));
return Err(Exceptions::writer("Invalid mask pattern".to_owned()));
}
let typeInfo = (ecLevel.get_value() << 3) as u32 | maskPattern;
bits.appendBits(typeInfo, 5)?;
@@ -365,10 +361,10 @@ pub fn makeTypeInfoBits(
if bits.getSize() != 15 {
// Just in case.
return Err(Exceptions::WriterException(Some(format!(
return Err(Exceptions::writer(format!(
"should not happen but we got: {}",
bits.getSize()
))));
)));
}
Ok(())
}
@@ -382,10 +378,10 @@ pub fn makeVersionInfoBits(version: &Version, bits: &mut BitArray) -> Result<(),
if bits.getSize() != 18 {
// Just in case.
return Err(Exceptions::WriterException(Some(format!(
return Err(Exceptions::writer(format!(
"should not happen but we got: {}",
bits.getSize()
))));
)));
}
Ok(())
}
@@ -415,7 +411,7 @@ pub fn embedTimingPatterns(matrix: &mut ByteMatrix) {
// Embed the lonely dark dot at left bottom corner. JISX0510:2004 (p.46)
pub fn embedDarkDotAtLeftBottomCorner(matrix: &mut ByteMatrix) -> Result<(), Exceptions> {
if matrix.get(8, matrix.getHeight() - 8) == 0 {
return Err(Exceptions::WriterException(None));
return Err(Exceptions::writerEmpty());
}
matrix.set(8, matrix.getHeight() - 8, 1);
Ok(())
@@ -428,7 +424,7 @@ pub fn embedHorizontalSeparationPattern(
) -> Result<(), Exceptions> {
for x in 0..8 {
if !isEmpty(matrix.get(xStart + x, yStart)) {
return Err(Exceptions::WriterException(None));
return Err(Exceptions::writerEmpty());
}
matrix.set(xStart + x, yStart, 0);
}
@@ -442,7 +438,7 @@ pub fn embedVerticalSeparationPattern(
) -> Result<(), Exceptions> {
for y in 0..7 {
if !isEmpty(matrix.get(xStart, yStart + y)) {
return Err(Exceptions::WriterException(None));
return Err(Exceptions::writerEmpty());
}
matrix.set(xStart, yStart + y, 0);
}

View File

@@ -158,9 +158,9 @@ impl MinimalEncoder {
Self::getVersion(Self::getVersionSize(result.getVersion()))?,
&self.ecLevel,
) {
return Err(Exceptions::WriterException(Some(format!(
return Err(Exceptions::writer(format!(
"Data too big for version {version}"
))));
)));
}
Ok(result)
} else {
@@ -186,9 +186,9 @@ impl MinimalEncoder {
}
}
if smallestRXingResult < 0 {
return Err(Exceptions::WriterException(Some(
return Err(Exceptions::writer(
"Data too big for any version".to_owned(),
)));
));
}
Ok(results[smallestRXingResult as usize].clone())
}
@@ -249,9 +249,9 @@ impl MinimalEncoder {
Some(Mode::ALPHANUMERIC) => Ok(1),
Some(Mode::BYTE) => Ok(3),
Some(Mode::KANJI) | None => Ok(0),
_ => Err(Exceptions::IllegalArgumentException(Some(format!(
_ => Err(Exceptions::illegalArgument(format!(
"Illegal mode {mode:?}"
)))),
))),
}
}
@@ -264,23 +264,23 @@ impl MinimalEncoder {
let vertexIndex = position
+ edge
.as_ref()
.ok_or(Exceptions::FormatException(None))?
.ok_or(Exceptions::formatEmpty())?
.characterLength as usize;
let modeEdges = &mut edges[vertexIndex][edge
.as_ref()
.ok_or(Exceptions::FormatException(None))?
.ok_or(Exceptions::formatEmpty())?
.charsetEncoderIndex];
let modeOrdinal = Self::getCompactedOrdinal(Some(
edge.as_ref().ok_or(Exceptions::FormatException(None))?.mode,
))? as usize;
let modeOrdinal =
Self::getCompactedOrdinal(Some(edge.as_ref().ok_or(Exceptions::formatEmpty())?.mode))?
as usize;
if modeEdges[modeOrdinal].is_none()
|| modeEdges[modeOrdinal]
.as_ref()
.ok_or(Exceptions::FormatException(None))?
.ok_or(Exceptions::formatEmpty())?
.cachedTotalSize
> edge
.as_ref()
.ok_or(Exceptions::FormatException(None))?
.ok_or(Exceptions::formatEmpty())?
.cachedTotalSize
{
modeEdges[modeOrdinal] = edge;
@@ -304,12 +304,12 @@ impl MinimalEncoder {
.encoders
.canEncode(
&self.stringToEncode[from],
priorityEncoderIndex.ok_or(Exceptions::FormatException(None))?,
priorityEncoderIndex.ok_or(Exceptions::formatEmpty())?,
)
.ok_or(Exceptions::FormatException(None))?
.ok_or(Exceptions::formatEmpty())?
{
start = priorityEncoderIndex.ok_or(Exceptions::FormatException(None))?;
end = priorityEncoderIndex.ok_or(Exceptions::FormatException(None))? + 1;
start = priorityEncoderIndex.ok_or(Exceptions::formatEmpty())?;
end = priorityEncoderIndex.ok_or(Exceptions::formatEmpty())? + 1;
}
for i in start..end {
@@ -318,10 +318,10 @@ impl MinimalEncoder {
.canEncode(
self.stringToEncode
.get(from)
.ok_or(Exceptions::IndexOutOfBoundsException(None))?,
.ok_or(Exceptions::indexOutOfBoundsEmpty())?,
i,
)
.ok_or(Exceptions::FormatException(None))?
.ok_or(Exceptions::formatEmpty())?
{
self.addEdge(
edges,
@@ -337,7 +337,7 @@ impl MinimalEncoder {
self.encoders.clone(),
self.stringToEncode.clone(),
)
.ok_or(Exceptions::WriterException(None))?,
.ok_or(Exceptions::writerEmpty())?,
)),
)?;
}
@@ -347,7 +347,7 @@ impl MinimalEncoder {
&Mode::KANJI,
self.stringToEncode
.get(from)
.ok_or(Exceptions::FormatException(None))?,
.ok_or(Exceptions::formatEmpty())?,
) {
self.addEdge(
edges,
@@ -363,7 +363,7 @@ impl MinimalEncoder {
self.encoders.clone(),
self.stringToEncode.clone(),
)
.ok_or(Exceptions::WriterException(None))?,
.ok_or(Exceptions::writerEmpty())?,
)),
)?;
}
@@ -373,7 +373,7 @@ impl MinimalEncoder {
&Mode::ALPHANUMERIC,
self.stringToEncode
.get(from)
.ok_or(Exceptions::IndexOutOfBoundsException(None))?,
.ok_or(Exceptions::indexOutOfBoundsEmpty())?,
) {
self.addEdge(
edges,
@@ -388,7 +388,7 @@ impl MinimalEncoder {
&Mode::ALPHANUMERIC,
self.stringToEncode
.get(from + 1)
.ok_or(Exceptions::IndexOutOfBoundsException(None))?,
.ok_or(Exceptions::indexOutOfBoundsEmpty())?,
)
{
1
@@ -400,7 +400,7 @@ impl MinimalEncoder {
self.encoders.clone(),
self.stringToEncode.clone(),
)
.ok_or(Exceptions::WriterException(None))?,
.ok_or(Exceptions::writerEmpty())?,
)),
)?;
}
@@ -409,7 +409,7 @@ impl MinimalEncoder {
&Mode::NUMERIC,
self.stringToEncode
.get(from)
.ok_or(Exceptions::IndexOutOfBoundsException(None))?,
.ok_or(Exceptions::indexOutOfBoundsEmpty())?,
) {
self.addEdge(
edges,
@@ -424,7 +424,7 @@ impl MinimalEncoder {
&Mode::NUMERIC,
self.stringToEncode
.get(from + 1)
.ok_or(Exceptions::IndexOutOfBoundsException(None))?,
.ok_or(Exceptions::indexOutOfBoundsEmpty())?,
)
{
1
@@ -433,7 +433,7 @@ impl MinimalEncoder {
&Mode::NUMERIC,
self.stringToEncode
.get(from + 2)
.ok_or(Exceptions::IndexOutOfBoundsException(None))?,
.ok_or(Exceptions::indexOutOfBoundsEmpty())?,
)
{
2
@@ -445,7 +445,7 @@ impl MinimalEncoder {
self.encoders.clone(),
self.stringToEncode.clone(),
)
.ok_or(Exceptions::WriterException(None))?,
.ok_or(Exceptions::writerEmpty())?,
)),
)?;
}
@@ -608,22 +608,22 @@ impl MinimalEncoder {
version,
edges[inputLength][minJ][minK]
.as_ref()
.ok_or(Exceptions::WriterException(None))?
.ok_or(Exceptions::writerEmpty())?
.clone(),
self.isGS1,
&self.ecLevel,
self.encoders.clone(),
self.stringToEncode.clone(),
)
.ok_or(Exceptions::WriterException(None))?)
.ok_or(Exceptions::writerEmpty())?)
} else {
Err(Exceptions::WriterException(Some(format!(
Err(Exceptions::writer(format!(
r#"Internal error: failed to encode "{}"#,
self.stringToEncode
.iter()
.map(String::from)
.collect::<String>()
))))
)))
}
}
}
@@ -1033,7 +1033,7 @@ impl RXingResultNode {
bits,
self.encoders
.getCharset(self.charsetEncoderIndex)
.ok_or(Exceptions::WriterException(None))?,
.ok_or(Exceptions::writerEmpty())?,
)?;
}
Ok(())

View File

@@ -101,8 +101,7 @@ pub fn encode_with_hints(
if has_encoding_hint {
if let Some(EncodeHintValue::CharacterSet(v)) = hints.get(&EncodeHintType::CHARACTER_SET) {
encoding = Some(
encoding::label::encoding_from_whatwg_label(v)
.ok_or(Exceptions::WriterException(None))?,
encoding::label::encoding_from_whatwg_label(v).ok_or(Exceptions::writerEmpty())?,
)
}
}
@@ -181,9 +180,9 @@ pub fn encode_with_hints(
version = Version::getVersionForNumber(versionNumber)?;
let bitsNeeded = calculateBitsNeeded(mode, &header_bits, &data_bits, version);
if !willFit(bitsNeeded, version, &ec_level) {
return Err(Exceptions::WriterException(Some(
return Err(Exceptions::writer(
"Data too big for requested version".to_owned(),
)));
));
}
} else {
version = recommendVersion(&ec_level, mode, &header_bits, &data_bits)?;
@@ -391,9 +390,9 @@ fn chooseVersion(
return Ok(version);
}
}
Err(Exceptions::WriterException(Some(format!(
Err(Exceptions::writer(format!(
"data too big {numInputBits}/{ecLevel:?}"
))))
)))
}
/**
@@ -419,9 +418,9 @@ pub fn willFit(numInputBits: u32, version: VersionRef, ecLevel: &ErrorCorrection
pub fn terminateBits(num_data_bytes: u32, bits: &mut BitArray) -> Result<(), Exceptions> {
let capacity = num_data_bytes * 8;
if bits.getSize() > capacity as usize {
return Err(Exceptions::WriterException(Some(format!(
return Err(Exceptions::writer(format!(
"data bits cannot fit in the QR Code{capacity} > "
))));
)));
}
// Append Mode.TERMINATE if there is enough space (value is 0000)
for _i in 0..4 {
@@ -447,9 +446,9 @@ pub fn terminateBits(num_data_bytes: u32, bits: &mut BitArray) -> Result<(), Exc
bits.appendBits(if (i & 0x01) == 0 { 0xEC } else { 0x11 }, 8)?;
}
if bits.getSize() != capacity as usize {
return Err(Exceptions::WriterException(Some(
return Err(Exceptions::writer(
"Bits size does not equal capacity".to_owned(),
)));
));
}
Ok(())
}
@@ -468,9 +467,7 @@ pub fn getNumDataBytesAndNumECBytesForBlockID(
// numECBytesInBlock: &mut [u32],
) -> Result<(u32, u32), Exceptions> {
if block_id >= num_rsblocks {
return Err(Exceptions::WriterException(Some(
"Block ID too large".to_owned(),
)));
return Err(Exceptions::writer("Block ID too large".to_owned()));
}
// numRsBlocksInGroup2 = 196 % 5 = 1
let num_rs_blocks_in_group2 = num_total_bytes % num_rsblocks;
@@ -491,24 +488,18 @@ pub fn getNumDataBytesAndNumECBytesForBlockID(
// Sanity checks.
// 26 = 26
if num_ec_bytes_in_group1 != numEcBytesInGroup2 {
return Err(Exceptions::WriterException(Some(
"EC bytes mismatch".to_owned(),
)));
return Err(Exceptions::writer("EC bytes mismatch".to_owned()));
}
// 5 = 4 + 1.
if num_rsblocks != num_rs_blocks_in_group1 + num_rs_blocks_in_group2 {
return Err(Exceptions::WriterException(Some(
"RS blocks mismatch".to_owned(),
)));
return Err(Exceptions::writer("RS blocks mismatch".to_owned()));
}
// 196 = (13 + 26) * 4 + (14 + 26) * 1
if num_total_bytes
!= ((num_data_bytes_in_group1 + num_ec_bytes_in_group1) * num_rs_blocks_in_group1)
+ ((num_data_bytes_in_group2 + numEcBytesInGroup2) * num_rs_blocks_in_group2)
{
return Err(Exceptions::WriterException(Some(
"total bytes mismatch".to_owned(),
)));
return Err(Exceptions::writer("total bytes mismatch".to_owned()));
}
Ok(if block_id < num_rs_blocks_in_group1 {
@@ -530,9 +521,9 @@ pub fn interleaveWithECBytes(
) -> Result<BitArray, Exceptions> {
// "bits" must have "getNumDataBytes" bytes of data.
if bits.getSizeInBytes() as u32 != num_data_bytes {
return Err(Exceptions::WriterException(Some(
return Err(Exceptions::writer(
"Number of bits and data bytes does not match".to_owned(),
)));
));
}
// Step 1. Divide data bytes into blocks and generate error correction bytes for them. We'll
@@ -565,9 +556,9 @@ pub fn interleaveWithECBytes(
data_bytes_offset += numDataBytesInBlock as usize;
}
if num_data_bytes != data_bytes_offset as u32 {
return Err(Exceptions::WriterException(Some(
return Err(Exceptions::writer(
"Data bytes does not match offset".to_owned(),
)));
));
}
let mut result = BitArray::new();
@@ -592,11 +583,11 @@ pub fn interleaveWithECBytes(
}
if num_total_bytes != result.getSizeInBytes() as u32 {
// Should be same.
return Err(Exceptions::WriterException(Some(format!(
return Err(Exceptions::writer(format!(
"Interleaving error: {} and {} differ.",
num_total_bytes,
result.getSizeInBytes()
))));
)));
}
Ok(result)
@@ -642,11 +633,11 @@ pub fn appendLengthInfo(
) -> Result<(), Exceptions> {
let numBits = mode.getCharacterCountBits(version);
if num_letters >= (1 << numBits) {
return Err(Exceptions::WriterException(Some(format!(
return Err(Exceptions::writer(format!(
"{} is bigger than {}",
num_letters,
((1 << numBits) - 1)
))));
)));
}
bits.appendBits(num_letters, numBits as usize)
}
@@ -665,9 +656,7 @@ pub fn appendBytes(
Mode::ALPHANUMERIC => appendAlphanumericBytes(content, bits),
Mode::BYTE => append8BitBytes(content, bits, encoding),
Mode::KANJI => appendKanjiBytes(content, bits),
_ => Err(Exceptions::WriterException(Some(format!(
"Invalid mode: {mode:?}"
)))),
_ => Err(Exceptions::writer(format!("Invalid mode: {mode:?}"))),
}
}
@@ -678,19 +667,19 @@ pub fn appendNumericBytes(content: &str, bits: &mut BitArray) -> Result<(), Exce
let num1 = content
.chars()
.nth(i)
.ok_or(Exceptions::IndexOutOfBoundsException(None))? as u8
.ok_or(Exceptions::indexOutOfBoundsEmpty())? as u8
- b'0';
if i + 2 < length {
// Encode three numeric letters in ten bits.
let num2 = content
.chars()
.nth(i + 1)
.ok_or(Exceptions::IndexOutOfBoundsException(None))? as u8
.ok_or(Exceptions::indexOutOfBoundsEmpty())? as u8
- b'0';
let num3 = content
.chars()
.nth(i + 2)
.ok_or(Exceptions::IndexOutOfBoundsException(None))? as u8
.ok_or(Exceptions::indexOutOfBoundsEmpty())? as u8
- b'0';
bits.appendBits(num1 as u32 * 100 + num2 as u32 * 10 + num3 as u32, 10)?;
i += 3;
@@ -699,7 +688,7 @@ pub fn appendNumericBytes(content: &str, bits: &mut BitArray) -> Result<(), Exce
let num2 = content
.chars()
.nth(i + 1)
.ok_or(Exceptions::IndexOutOfBoundsException(None))? as u8
.ok_or(Exceptions::indexOutOfBoundsEmpty())? as u8
- b'0';
bits.appendBits(num1 as u32 * 10 + num2 as u32, 7)?;
i += 2;
@@ -720,20 +709,20 @@ pub fn appendAlphanumericBytes(content: &str, bits: &mut BitArray) -> Result<(),
content
.chars()
.nth(i)
.ok_or(Exceptions::IndexOutOfBoundsException(None))? as u32,
.ok_or(Exceptions::indexOutOfBoundsEmpty())? as u32,
);
if code1 == -1 {
return Err(Exceptions::WriterException(None));
return Err(Exceptions::writerEmpty());
}
if i + 1 < length {
let code2 = getAlphanumericCode(
content
.chars()
.nth(i + 1)
.ok_or(Exceptions::IndexOutOfBoundsException(None))? as u32,
.ok_or(Exceptions::indexOutOfBoundsEmpty())? as u32,
);
if code2 == -1 {
return Err(Exceptions::WriterException(None));
return Err(Exceptions::writerEmpty());
}
// Encode two alphanumeric letters in 11 bits.
bits.appendBits((code1 as i16 * 45 + code2 as i16) as u32, 11)?;
@@ -754,7 +743,7 @@ pub fn append8BitBytes(
) -> Result<(), Exceptions> {
let bytes = encoding
.encode(content, encoding::EncoderTrap::Strict)
.map_err(|e| Exceptions::WriterException(Some(format!("error {e}"))))?;
.map_err(|e| Exceptions::writer(format!("error {e}")))?;
for b in bytes {
bits.appendBits(b as u32, 8)?;
}
@@ -766,11 +755,9 @@ pub fn appendKanjiBytes(content: &str, bits: &mut BitArray) -> Result<(), Except
let bytes = sjis
.encode(content, encoding::EncoderTrap::Strict)
.map_err(|e| Exceptions::WriterException(Some(format!("error {e}"))))?;
.map_err(|e| Exceptions::writer(format!("error {e}")))?;
if bytes.len() % 2 != 0 {
return Err(Exceptions::WriterException(Some(
"Kanji byte size not even".to_owned(),
)));
return Err(Exceptions::writer("Kanji byte size not even".to_owned()));
}
let max_i = bytes.len() - 1; // bytes.length must be even
let mut i = 0;
@@ -785,9 +772,7 @@ pub fn appendKanjiBytes(content: &str, bits: &mut BitArray) -> Result<(), Except
subtracted = code as i32 - 0xc140;
}
if subtracted == -1 {
return Err(Exceptions::WriterException(Some(
"Invalid byte sequence".to_owned(),
)));
return Err(Exceptions::writer("Invalid byte sequence".to_owned()));
}
let encoded = ((subtracted >> 8) * 0xc0) + (subtracted & 0xff);
bits.appendBits(encoded as u32, 13)?;

View File

@@ -83,7 +83,7 @@ impl Reader for QRCodeReader {
// if (decoderRXingResult.getOther() instanceof QRCodeDecoderMetaData) {
other
.downcast_ref::<QRCodeDecoderMetaData>()
.ok_or(Exceptions::IllegalStateException(None))?
.ok_or(Exceptions::illegalStateEmpty())?
.applyMirroredCorrection(&mut points);
}
}
@@ -153,12 +153,11 @@ impl QRCodeReader {
let leftTopBlack = image.getTopLeftOnBit();
let rightBottomBlack = image.getBottomRightOnBit();
if leftTopBlack.is_none() || rightBottomBlack.is_none() {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
let leftTopBlack = leftTopBlack.ok_or(Exceptions::IndexOutOfBoundsException(None))?;
let rightBottomBlack =
rightBottomBlack.ok_or(Exceptions::IndexOutOfBoundsException(None))?;
let leftTopBlack = leftTopBlack.ok_or(Exceptions::indexOutOfBoundsEmpty())?;
let rightBottomBlack = rightBottomBlack.ok_or(Exceptions::indexOutOfBoundsEmpty())?;
let moduleSize = Self::moduleSize(&leftTopBlack, image)?;
@@ -169,7 +168,7 @@ impl QRCodeReader {
// Sanity check!
if left >= right || top >= bottom {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
if bottom - top != right - left {
@@ -178,17 +177,17 @@ impl QRCodeReader {
right = left + (bottom - top);
if right >= image.getWidth() as i32 {
// Abort if that would not make sense -- off image
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
}
let matrixWidth = ((right as f32 - left as f32 + 1.0) / moduleSize).round() as u32;
let matrixHeight = ((bottom as f32 - top as f32 + 1.0) / moduleSize).round() as u32;
if matrixWidth == 0 || matrixHeight == 0 {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
if matrixHeight != matrixWidth {
// Only possibly decode square regions
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
// Push in the "border" by half the module width so that we start
@@ -206,7 +205,7 @@ impl QRCodeReader {
if nudgedTooFarRight > 0 {
if nudgedTooFarRight > nudge as i32 {
// Neither way fits; abort
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
left -= nudgedTooFarRight;
}
@@ -215,7 +214,7 @@ impl QRCodeReader {
if nudgedTooFarDown > 0 {
if nudgedTooFarDown > nudge as i32 {
// Neither way fits; abort
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
top -= nudgedTooFarDown;
}
@@ -252,7 +251,7 @@ impl QRCodeReader {
y += 1;
}
if x == width || y == height {
return Err(Exceptions::NotFoundException(None));
return Err(Exceptions::notFoundEmpty());
}
Ok((x - leftTopBlack[0]) as f32 / 7.0)
}

View File

@@ -58,22 +58,22 @@ impl Writer for QRCodeWriter {
hints: &crate::EncodingHintDictionary,
) -> Result<crate::common::BitMatrix, crate::Exceptions> {
if contents.is_empty() {
return Err(Exceptions::IllegalArgumentException(Some(
return Err(Exceptions::illegalArgument(
"found empty contents".to_owned(),
)));
));
}
if format != &BarcodeFormat::QR_CODE {
return Err(Exceptions::IllegalArgumentException(Some(format!(
return Err(Exceptions::illegalArgument(format!(
"can only encode QR_CODE, but got {format:?}"
))));
)));
// throw new IllegalArgumentException("Can only encode QR_CODE, but got " + format);
}
if width < 0 || height < 0 {
return Err(Exceptions::IllegalArgumentException(Some(format!(
return Err(Exceptions::illegalArgument(format!(
"requested dimensions are too small: {width}x{height}"
))));
)));
}
let errorCorrectionLevel = if let Some(EncodeHintValue::ErrorCorrection(ec_level)) =
@@ -86,9 +86,9 @@ impl Writer for QRCodeWriter {
let quietZone =
if let Some(EncodeHintValue::Margin(margin)) = hints.get(&EncodeHintType::MARGIN) {
margin.parse::<i32>().map_err(|e| {
Exceptions::ParseException(Some(format!("could not parse {margin}: {e}")))
})?
margin
.parse::<i32>()
.map_err(|e| Exceptions::parse(format!("could not parse {margin}: {e}")))?
} else {
QUIET_ZONE_SIZE
};
@@ -110,14 +110,10 @@ impl QRCodeWriter {
) -> Result<BitMatrix, Exceptions> {
let input = code.getMatrix();
if input.is_none() {
return Err(Exceptions::IllegalStateException(Some(
"matrix is empty".to_owned(),
)));
return Err(Exceptions::illegalState("matrix is empty".to_owned()));
}
let input = input
.as_ref()
.ok_or(Exceptions::IllegalStateException(None))?;
let input = input.as_ref().ok_or(Exceptions::illegalStateEmpty())?;
let inputWidth = input.getWidth() as i32;
let inputHeight = input.getHeight() as i32;