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

@@ -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)?;