cargo fmt

This commit is contained in:
Henry Schimke
2022-12-17 18:47:54 -06:00
parent d9b0d46f71
commit 2a27b182c1
7 changed files with 675 additions and 580 deletions

View File

@@ -1,5 +1,3 @@
mod pdf_417_detector_result; mod pdf_417_detector_result;
pub use pdf_417_detector_result::*; pub use pdf_417_detector_result::*;

View File

@@ -14,15 +14,12 @@
* limitations under the License. * limitations under the License.
*/ */
/** /**
* Represents possible PDF417 barcode compaction types. * Represents possible PDF417 barcode compaction types.
*/ */
pub enum Compaction { pub enum Compaction {
AUTO = 0, AUTO = 0,
TEXT = 1, TEXT = 1,
BYTE = 2, BYTE = 2,
NUMERIC=3 NUMERIC = 3,
} }

View File

@@ -1,4 +1,3 @@
mod compaction; mod compaction;
pub use compaction::*; pub use compaction::*;

View File

@@ -18,11 +18,14 @@
* This file has been modified from its original form in Barcode4J. * This file has been modified from its original form in Barcode4J.
*/ */
use std::{fmt::Display, any::TypeId}; use std::{any::TypeId, fmt::Display};
use encoding::EncodingRef; use encoding::EncodingRef;
use crate::{Exceptions, common::{ECIInput, MinimalECIInput, CharacterSetECI}}; use crate::{
common::{CharacterSetECI, ECIInput, MinimalECIInput},
Exceptions,
};
use super::Compaction; use super::Compaction;
@@ -110,15 +113,17 @@ use super::Compaction;
* Raw code table for text compaction Mixed sub-mode * Raw code table for text compaction Mixed sub-mode
*/ */
const TEXT_MIXED_RAW: [u8; 30] = [ const TEXT_MIXED_RAW: [u8; 30] = [
48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 38, 13, 9, 44, 58, 35, 45, 46, 36, 47, 43, 37, 42, 61,
35, 45, 46, 36, 47, 43, 37, 42, 61, 94, 0, 32, 0, 0, 0]; 94, 0, 32, 0, 0, 0,
];
/** /**
* Raw code table for text compaction: Punctuation sub-mode * Raw code table for text compaction: Punctuation sub-mode
*/ */
const TEXT_PUNCTUATION_RAW: [u8; 30] = [ const TEXT_PUNCTUATION_RAW: [u8; 30] = [
59, 60, 62, 64, 91, 92, 93, 95, 96, 126, 33, 13, 9, 44, 58, 59, 60, 62, 64, 91, 92, 93, 95, 96, 126, 33, 13, 9, 44, 58, 10, 45, 46, 36, 47, 34, 124, 42,
10, 45, 46, 36, 47, 34, 124, 42, 40, 41, 63, 123, 125, 39, 0]; 40, 41, 63, 123, 125, 39, 0,
];
// const MIXED : [u8;128]= [0;128];//new byte[128]; // const MIXED : [u8;128]= [0;128];//new byte[128];
@@ -187,11 +192,17 @@ punct
* then charsets will be chosen so that the byte representation is minimal. * then charsets will be chosen so that the byte representation is minimal.
* @return the encoded message (the char values range from 0 to 928) * @return the encoded message (the char values range from 0 to 928)
*/ */
pub fn encodeHighLevel( msg:&str, compaction:Compaction, encoding:Option<EncodingRef>, autoECI:bool) pub fn encodeHighLevel(
-> Result<String,Exceptions> { msg: &str,
compaction: Compaction,
encoding: Option<EncodingRef>,
autoECI: bool,
) -> Result<String, Exceptions> {
let mut encoding = encoding; let mut encoding = encoding;
if msg.is_empty() { if msg.is_empty() {
return Err(Exceptions::WriterException("Empty message not allowed".to_owned())); return Err(Exceptions::WriterException(
"Empty message not allowed".to_owned(),
));
} }
if encoding.is_none() && !autoECI { if encoding.is_none() && !autoECI {
@@ -226,19 +237,31 @@ let mut encoding = encoding;
// User selected encoding mode // User selected encoding mode
match compaction { match compaction {
Compaction::TEXT=> Compaction::TEXT => {
{encodeText(&input, p, len as u32, &mut sb, textSubMode)?;}, encodeText(&input, p, len as u32, &mut sb, textSubMode)?;
Compaction:: BYTE=> }
Compaction::BYTE => {
if autoECI { if autoECI {
encodeMultiECIBinary(&input, 0, input.length() as u32, TEXT_COMPACTION, &mut sb)?; encodeMultiECIBinary(&input, 0, input.length() as u32, TEXT_COMPACTION, &mut sb)?;
} else { } else {
let msgBytes = encoding
let msgBytes = encoding.as_ref().unwrap().encode(&input.to_string(), encoding::EncoderTrap::Strict).unwrap_or_default(); //input.to_string().getBytes(encoding); .as_ref()
encodeBinary(&msgBytes, p, msgBytes.len() as u32, BYTE_COMPACTION, &mut sb); .unwrap()
}, .encode(&input.to_string(), encoding::EncoderTrap::Strict)
Compaction:: NUMERIC=> .unwrap_or_default(); //input.to_string().getBytes(encoding);
{sb.push(char::from_u32( LATCH_TO_NUMERIC).unwrap()); encodeBinary(
encodeNumeric(&input, p, len as u32, &mut sb);}, &msgBytes,
p,
msgBytes.len() as u32,
BYTE_COMPACTION,
&mut sb,
);
}
}
Compaction::NUMERIC => {
sb.push(char::from_u32(LATCH_TO_NUMERIC).unwrap());
encodeNumeric(&input, p, len as u32, &mut sb);
}
_ => { _ => {
let mut encodingMode = TEXT_COMPACTION; //Default mode, see 4.4.2.1 let mut encodingMode = TEXT_COMPACTION; //Default mode, see 4.4.2.1
while p < len as u32 { while p < len as u32 {
@@ -267,13 +290,26 @@ let mut encoding = encoding;
textSubMode = encodeText(&input, p, t, &mut sb, textSubMode)?; textSubMode = encodeText(&input, p, t, &mut sb, textSubMode)?;
p += t; p += t;
} else { } else {
let mut b = determineConsecutiveBinaryCount(&input, p, if autoECI {None} else {encoding})?; let mut b = determineConsecutiveBinaryCount(
&input,
p,
if autoECI { None } else { encoding },
)?;
if b == 0 { if b == 0 {
b = 1; b = 1;
} }
let bytes = if autoECI {None} else { let bytes = if autoECI {
let str = input.subSequence(p as usize, (p + b) as usize)?.iter().collect::<String>(); None
if let Ok(enc_str) = encoding.as_ref().unwrap().encode(&str, encoding::EncoderTrap::Strict) { } else {
let str = input
.subSequence(p as usize, (p + b) as usize)?
.iter()
.collect::<String>();
if let Ok(enc_str) = encoding
.as_ref()
.unwrap()
.encode(&str, encoding::EncoderTrap::Strict)
{
Some(enc_str) Some(enc_str)
} else { } else {
None None
@@ -281,20 +317,34 @@ let mut encoding = encoding;
}; //.getBytes(encoding))}; }; //.getBytes(encoding))};
// if let Some(byts) = bytes { // if let Some(byts) = bytes {
let bytes_ok = if let Some(_) = bytes { true } else { false }; let bytes_ok = if let Some(_) = bytes { true } else { false };
if ((bytes_ok && b == 1) || (!bytes_ok && bytes.as_ref().unwrap().len() == 1)) if ((bytes_ok && b == 1)
&& encodingMode == TEXT_COMPACTION { || (!bytes_ok && bytes.as_ref().unwrap().len() == 1))
&& encodingMode == TEXT_COMPACTION
{
//Switch for one byte (instead of latch) //Switch for one byte (instead of latch)
if autoECI { if autoECI {
encodeMultiECIBinary(&input, p, 1, TEXT_COMPACTION, &mut sb)?; encodeMultiECIBinary(&input, p, 1, TEXT_COMPACTION, &mut sb)?;
} else { } else {
encodeBinary(bytes.as_ref().unwrap(), 0, 1, TEXT_COMPACTION, &mut sb); encodeBinary(
bytes.as_ref().unwrap(),
0,
1,
TEXT_COMPACTION,
&mut sb,
);
} }
} else { } else {
//Mode latch performed by encodeBinary() //Mode latch performed by encodeBinary()
if autoECI { if autoECI {
encodeMultiECIBinary(&input, p, p + b, encodingMode, &mut sb)?; encodeMultiECIBinary(&input, p, p + b, encodingMode, &mut sb)?;
} else { } else {
encodeBinary(bytes.as_ref().unwrap(), 0, bytes.as_ref().unwrap().len() as u32, encodingMode, &mut sb); encodeBinary(
bytes.as_ref().unwrap(),
0,
bytes.as_ref().unwrap().len() as u32,
encodingMode,
&mut sb,
);
} }
encodingMode = BYTE_COMPACTION; encodingMode = BYTE_COMPACTION;
textSubMode = SUBMODE_ALPHA; //Reset after latch textSubMode = SUBMODE_ALPHA; //Reset after latch
@@ -302,7 +352,8 @@ let mut encoding = encoding;
p += b; p += b;
} }
} }
}}, }
}
} }
Ok(sb) Ok(sb)
@@ -319,11 +370,13 @@ let mut encoding = encoding;
* @param initialSubmode should normally be SUBMODE_ALPHA * @param initialSubmode should normally be SUBMODE_ALPHA
* @return the text submode in which this method ends * @return the text submode in which this method ends
*/ */
fn encodeText<T:ECIInput+?Sized>( input:&Box<T>, fn encodeText<T: ECIInput + ?Sized>(
input: &Box<T>,
startpos: u32, startpos: u32,
count: u32, count: u32,
sb: &mut String, sb: &mut String,
initialSubmode:u32) -> Result<u32,Exceptions> { initialSubmode: u32,
) -> Result<u32, Exceptions> {
let mut tmp = String::with_capacity(count as usize); let mut tmp = String::with_capacity(count as usize);
let mut submode = initialSubmode; let mut submode = initialSubmode;
let mut idx = 0; let mut idx = 0;
@@ -334,7 +387,7 @@ let mut encoding = encoding;
} else { } else {
let ch = input.charAt((startpos + idx) as usize)?; let ch = input.charAt((startpos + idx) as usize)?;
match submode { match submode {
SUBMODE_ALPHA=> SUBMODE_ALPHA => {
if isAlphaUpper(ch) { if isAlphaUpper(ch) {
if ch == ' ' { if ch == ' ' {
tmp.push(26 as char); //space tmp.push(26 as char); //space
@@ -355,9 +408,10 @@ let mut encoding = encoding;
tmp.push(char::from_u32(PUNCTUATION[ch as usize] as u32).unwrap()); tmp.push(char::from_u32(PUNCTUATION[ch as usize] as u32).unwrap());
break; break;
} }
}, }
}
// break; // break;
SUBMODE_LOWER=> SUBMODE_LOWER => {
if isAlphaLower(ch) { if isAlphaLower(ch) {
if ch == ' ' { if ch == ' ' {
tmp.push(26 as char); //space tmp.push(26 as char); //space
@@ -379,9 +433,10 @@ let mut encoding = encoding;
tmp.push(char::from_u32(PUNCTUATION[ch as usize] as u32).unwrap()); tmp.push(char::from_u32(PUNCTUATION[ch as usize] as u32).unwrap());
break; break;
} }
}, }
}
// break; // break;
SUBMODE_MIXED=> SUBMODE_MIXED => {
if isMixed(ch) { if isMixed(ch) {
tmp.push(char::from_u32(MIXED[ch as usize] as u32).unwrap()); tmp.push(char::from_u32(MIXED[ch as usize] as u32).unwrap());
} else { } else {
@@ -395,7 +450,9 @@ let mut encoding = encoding;
continue; continue;
} else { } else {
if startpos + idx + 1 < count { if startpos + idx + 1 < count {
if !input.isECI(startpos + idx + 1)? && isPunctuation(input.charAt((startpos + idx + 1) as usize)?) { if !input.isECI(startpos + idx + 1)?
&& isPunctuation(input.charAt((startpos + idx + 1) as usize)?)
{
submode = SUBMODE_PUNCTUATION; submode = SUBMODE_PUNCTUATION;
tmp.push(25 as char); //pl tmp.push(25 as char); //pl
continue; continue;
@@ -404,15 +461,19 @@ let mut encoding = encoding;
tmp.push(29 as char); //ps tmp.push(29 as char); //ps
tmp.push(char::from_u32(PUNCTUATION[ch as usize] as u32).unwrap()); tmp.push(char::from_u32(PUNCTUATION[ch as usize] as u32).unwrap());
} }
}, }
_=> //SUBMODE_PUNCTUATION }
_ =>
//SUBMODE_PUNCTUATION
{
if isPunctuation(ch) { if isPunctuation(ch) {
tmp.push(char::from_u32(PUNCTUATION[ch as usize] as u32).unwrap()); tmp.push(char::from_u32(PUNCTUATION[ch as usize] as u32).unwrap());
} else { } else {
submode = SUBMODE_ALPHA; submode = SUBMODE_ALPHA;
tmp.push(29 as char); //al tmp.push(29 as char); //al
continue; continue;
}, }
}
} }
idx += 1; idx += 1;
if idx >= count { if idx >= count {
@@ -447,11 +508,13 @@ let mut encoding = encoding;
* @param startmode the mode from which this method starts * @param startmode the mode from which this method starts
* @param sb receives the encoded codewords * @param sb receives the encoded codewords
*/ */
fn encodeMultiECIBinary<T:ECIInput + ?Sized>( input:&Box<T>, fn encodeMultiECIBinary<T: ECIInput + ?Sized>(
input: &Box<T>,
startpos: u32, startpos: u32,
count: u32, count: u32,
startmode: u32, startmode: u32,
sb:&mut String) -> Result<(),Exceptions> { sb: &mut String,
) -> Result<(), Exceptions> {
let end = (startpos + count).min(input.length() as u32); let end = (startpos + count).min(input.length() as u32);
let mut localStart = startpos; let mut localStart = startpos;
loop { loop {
@@ -472,8 +535,17 @@ let mut encoding = encoding;
break; break;
} else { } else {
//encode the segment //encode the segment
encodeBinary(&subBytes(input, localStart, localEnd), encodeBinary(
0, localCount, if localStart == startpos {startmode} else {BYTE_COMPACTION}, sb); &subBytes(input, localStart, localEnd),
0,
localCount,
if localStart == startpos {
startmode
} else {
BYTE_COMPACTION
},
sb,
);
localStart = localEnd; localStart = localEnd;
} }
} }
@@ -502,11 +574,7 @@ let mut encoding = encoding;
* @param startmode the mode from which this method starts * @param startmode the mode from which this method starts
* @param sb receives the encoded codewords * @param sb receives the encoded codewords
*/ */
fn encodeBinary( bytes:&[u8], fn encodeBinary(bytes: &[u8], startpos: u32, count: u32, startmode: u32, sb: &mut String) {
startpos: u32,
count: u32,
startmode: u32,
sb:&mut String) {
if count == 1 && startmode == TEXT_COMPACTION { if count == 1 && startmode == TEXT_COMPACTION {
sb.push(char::from_u32(SHIFT_TO_BYTE).unwrap()); sb.push(char::from_u32(SHIFT_TO_BYTE).unwrap());
} else { } else {
@@ -556,13 +624,25 @@ let mut encoding = encoding;
while idx < count { while idx < count {
tmp.clear(); tmp.clear();
let len = 44.min(count as isize - idx as isize); let len = 44.min(count as isize - idx as isize);
let part = format!("1{}", input.subSequence((startpos + idx) as usize, (startpos + idx + len as u32) as usize).unwrap().iter().collect::<String>()); let part = format!(
"1{}",
input
.subSequence(
(startpos + idx) as usize,
(startpos + idx + len as u32) as usize
)
.unwrap()
.iter()
.collect::<String>()
);
let mut bigint: u128 = part.parse().unwrap(); let mut bigint: u128 = part.parse().unwrap();
loop { loop {
tmp.push(char::from_u32((bigint % num900) as u32).unwrap()); tmp.push(char::from_u32((bigint % num900) as u32).unwrap());
bigint = bigint / num900; bigint = bigint / num900;
if !(!bigint == num0) { break; } if !(!bigint == num0) {
break;
}
} //while (!bigint.equals(num0)); } //while (!bigint.equals(num0));
//Reverse temporary string //Reverse temporary string
@@ -577,7 +657,6 @@ let mut encoding = encoding;
} }
} }
fn isDigit(ch: char) -> bool { fn isDigit(ch: char) -> bool {
return ch >= '0' && ch <= '9'; return ch >= '0' && ch <= '9';
} }
@@ -614,7 +693,8 @@ let mut encoding = encoding;
let len = input.length(); let len = input.length();
let mut idx = startpos as usize; let mut idx = startpos as usize;
if idx < len { if idx < len {
while idx < len && !input.isECI(idx as u32).unwrap() && isDigit(input.charAt(idx).unwrap()) { while idx < len && !input.isECI(idx as u32).unwrap() && isDigit(input.charAt(idx).unwrap())
{
count += 1; count += 1;
idx += 1; idx += 1;
} }
@@ -635,7 +715,11 @@ let mut encoding = encoding;
let mut idx = startpos as usize; let mut idx = startpos as usize;
while idx < len { while idx < len {
let mut numericCount = 0; let mut numericCount = 0;
while numericCount < 13 && idx < len && !input.isECI(idx as u32).unwrap() && isDigit(input.charAt(idx).unwrap()) { while numericCount < 13
&& idx < len
&& !input.isECI(idx as u32).unwrap()
&& isDigit(input.charAt(idx).unwrap())
{
numericCount += 1; numericCount += 1;
idx += 1; idx += 1;
} }
@@ -664,8 +748,11 @@ let mut encoding = encoding;
* @param encoding the charset used to convert the message to a byte array * @param encoding the charset used to convert the message to a byte array
* @return the requested character count * @return the requested character count
*/ */
fn determineConsecutiveBinaryCount<T: ECIInput+?Sized+'static>( input:&Box<T>, startpos:u32, encoding:Option<EncodingRef>) fn determineConsecutiveBinaryCount<T: ECIInput + ?Sized + 'static>(
-> Result<u32,Exceptions> { input: &Box<T>,
startpos: u32,
encoding: Option<EncodingRef>,
) -> Result<u32, Exceptions> {
// CharsetEncoder encoder = encoding == null ? null : encoding.newEncoder(); // CharsetEncoder encoder = encoding == null ? null : encoding.newEncoder();
let len = input.length(); let len = input.length();
let mut idx = startpos as usize; let mut idx = startpos as usize;
@@ -673,7 +760,10 @@ let mut encoding = encoding;
let mut numericCount = 0; let mut numericCount = 0;
let mut i = idx; let mut i = idx;
while numericCount < 13 && !input.isECI(i as u32).unwrap() && isDigit(input.charAt(i).unwrap()) { while numericCount < 13
&& !input.isECI(i as u32).unwrap()
&& isDigit(input.charAt(i).unwrap())
{
numericCount += 1; numericCount += 1;
//textCount++; //textCount++;
i = idx + numericCount; i = idx + numericCount;
@@ -686,15 +776,24 @@ let mut encoding = encoding;
} }
if let Some(encoder) = encoding { if let Some(encoder) = encoding {
let can_encode = encoder.encode(&input.charAt(idx)?.to_string(), encoding::EncoderTrap::Strict).is_ok(); let can_encode = encoder
.encode(
&input.charAt(idx)?.to_string(),
encoding::EncoderTrap::Strict,
)
.is_ok();
// if encoder != null && !encoder.canEncode(input.charAt(idx)) { // if encoder != null && !encoder.canEncode(input.charAt(idx)) {
if !can_encode { if !can_encode {
assert!(TypeId::of::<T>() == TypeId::of::<NoECIInput>()); assert!(TypeId::of::<T>() == TypeId::of::<NoECIInput>());
// assert!(input instanceof NoECIInput); // assert!(input instanceof NoECIInput);
let ch = input.charAt(idx).unwrap(); let ch = input.charAt(idx).unwrap();
return Err(Exceptions::WriterException(format!("Non-encodable character detected: {} (Unicode: {})", ch, ch as u32))); return Err(Exceptions::WriterException(format!(
}} "Non-encodable character detected: {} (Unicode: {})",
ch, ch as u32
)));
}
}
idx += 1; idx += 1;
} }
Ok(idx as u32 - startpos) Ok(idx as u32 - startpos)
@@ -712,7 +811,10 @@ let mut encoding = encoding;
sb.push(char::from_u32(ECI_USER_DEFINED).unwrap()); sb.push(char::from_u32(ECI_USER_DEFINED).unwrap());
sb.push(char::from_u32((810900 - eci) as u32).unwrap()); sb.push(char::from_u32((810900 - eci) as u32).unwrap());
} else { } else {
return Err(Exceptions::WriterException(format!("ECI number not in valid range from 0..811799, but was {}" , eci))); return Err(Exceptions::WriterException(format!(
"ECI number not in valid range from 0..811799, but was {}",
eci
)));
} }
Ok(()) Ok(())
} }
@@ -749,7 +851,6 @@ let mut encoding = encoding;
} }
} }
impl NoECIInput { impl NoECIInput {
pub fn new(input: String) -> Self { pub fn new(input: String) -> Self {
Self(input) Self(input)
} }