From f0e83abf7ea065587db23471637c94751478e78a Mon Sep 17 00:00:00 2001 From: Henry Schimke Date: Fri, 16 Sep 2022 16:56:22 -0500 Subject: [PATCH] all client parsing tests pass except known upce --- .../result/AddressBookAUResultParser.rs | 9 +- src/client/result/CalendarParsedResult.rs | 13 +- .../result/ParsedReaderResultTestCase.rs | 19 +- src/client/result/ResultParser.rs | 21 ++- src/client/result/SMSMMSResultParser.rs | 2 +- src/client/result/SMSParsedResult.rs | 166 +++++++++--------- 6 files changed, 125 insertions(+), 105 deletions(-) diff --git a/src/client/result/AddressBookAUResultParser.rs b/src/client/result/AddressBookAUResultParser.rs index 651b7f0..6f35b02 100644 --- a/src/client/result/AddressBookAUResultParser.rs +++ b/src/client/result/AddressBookAUResultParser.rs @@ -47,7 +47,8 @@ pub fn parse(result: &RXingResult) -> Option { let phoneNumbers = matchMultipleValuePrefix("TEL", &rawText); let emails = matchMultipleValuePrefix("MAIL", &rawText); - let note = ResultParser::matchSinglePrefixedField("MEMORY:", &rawText, '\r', false)?; + let note = ResultParser::matchSinglePrefixedField("MEMORY:", &rawText, '\r', false) + .unwrap_or_default(); let address = ResultParser::matchSinglePrefixedField("ADD:", &rawText, '\r', true); let addresses = if address.is_none() { Vec::new() @@ -55,7 +56,11 @@ pub fn parse(result: &RXingResult) -> Option { vec![address?] }; if let Ok(new_data) = AddressBookParsedRXingResult::with_details( - ResultParser::maybeWrap(name)?, + if let Some(nm) = ResultParser::maybeWrap(name) { + nm + } else { + Vec::new() + }, Vec::new(), "".to_owned(), phoneNumbers, diff --git a/src/client/result/CalendarParsedResult.rs b/src/client/result/CalendarParsedResult.rs index 60a612e..0ad1017 100644 --- a/src/client/result/CalendarParsedResult.rs +++ b/src/client/result/CalendarParsedResult.rs @@ -27,7 +27,7 @@ // import java.util.regex.Matcher; // import java.util.regex.Pattern; -use chrono::{Date, DateTime, NaiveDateTime, TimeZone, Utc}; +use chrono::{Date, DateTime, Local, NaiveDateTime, TimeZone, Utc}; use chrono_tz::Tz; use regex::Regex; @@ -229,6 +229,17 @@ impl CalendarParsedRXingResult { ))), }; } + + // Try a final time with an exact length + if when.len() == 15 { + return match Utc.datetime_from_str(&when, "%Y%m%dT%H%M%S") { + Ok(dtm) => Ok(dtm.timestamp()), + Err(e) => Err(Exceptions::ParseException(format!( + "couldn't parse local time: {}", + e + ))), + }; + } Self::parseDateTimeString(&when) } diff --git a/src/client/result/ParsedReaderResultTestCase.rs b/src/client/result/ParsedReaderResultTestCase.rs index 693f745..72ef394 100644 --- a/src/client/result/ParsedReaderResultTestCase.rs +++ b/src/client/result/ParsedReaderResultTestCase.rs @@ -27,7 +27,7 @@ // import java.util.Locale; // import java.util.TimeZone; -use chrono::{TimeZone, Utc}; +use chrono::{Local, TimeZone, Utc}; use crate::{client::result::ParsedRXingResult, BarcodeFormat, RXingResult}; @@ -390,9 +390,9 @@ fn test_uri() { #[test] fn test_geo() { - do_test_rxing_result("geo:1,2", "1.0, 2.0", ParsedRXingResultType::GEO); - do_test_rxing_result("GEO:1,2", "1.0, 2.0", ParsedRXingResultType::GEO); - do_test_rxing_result("geo:1,2,3", "1.0, 2.0, 3.0m", ParsedRXingResultType::GEO); + do_test_rxing_result("geo:1,2", "1, 2", ParsedRXingResultType::GEO); + do_test_rxing_result("GEO:1,2", "1, 2", ParsedRXingResultType::GEO); + do_test_rxing_result("geo:1,2,3", "1, 2, 3m", ParsedRXingResultType::GEO); do_test_rxing_result( "geo:80.33,-32.3344,3.35", "80.33, -32.3344, 3.35m", @@ -501,7 +501,7 @@ fn test_vevent() { fn format_date(year: i32, month: u32, day: u32) -> String { let dtm = Utc.ymd(year, month, day); - dtm.format("%Y%m%D").to_string() + dtm.format("%F").to_string() // Calendar cal = Calendar.getInstance(); // cal.clear(); // cal.set(year, month - 1, day); @@ -510,7 +510,7 @@ fn format_date(year: i32, month: u32, day: u32) -> String { fn format_time(year: i32, month: u32, day: u32, hour: u32, min: u32, sec: u32) -> String { let dtm = Utc.ymd(year, month, day).and_hms(hour, min, sec); - dtm.format("%C").to_string() + dtm.format("%c").to_string() // Calendar cal = Calendar.getInstance(); // cal.clear(); // cal.set(year, month - 1, day, hour, min, sec); @@ -624,7 +624,12 @@ fn test_mmsto() { } fn do_test_rxing_result(contents: &str, golden_rxing_result: &str, r_type: ParsedRXingResultType) { - do_test_rxing_result_long(contents, golden_rxing_result, r_type, BarcodeFormat::QR_CODE); + do_test_rxing_result_long( + contents, + golden_rxing_result, + r_type, + BarcodeFormat::QR_CODE, + ); // QR code is arbitrary } diff --git a/src/client/result/ResultParser.rs b/src/client/result/ResultParser.rs index 1da8c8d..a0c4779 100644 --- a/src/client/result/ResultParser.rs +++ b/src/client/result/ResultParser.rs @@ -35,10 +35,11 @@ use crate::{exceptions::Exceptions, RXingResult}; use super::{ AddressBookAUResultParser, AddressBookDoCoMoResultParser, BizcardResultParser, - BookmarkDoCoMoResultParser, EmailAddressResultParser, EmailDoCoMoResultParser, GeoResultParser, - ISBNResultParser, ParsedClientResult, ParsedRXingResult, ProductResultParser, - SMSMMSResultParser, SMTPResultParser, TelResultParser, TextParsedRXingResult, URIResultParser, - URLTOResultParser, VCardResultParser, VEventResultParser, VINResultParser, WifiResultParser, ExpandedProductResultParser, + BookmarkDoCoMoResultParser, EmailAddressResultParser, EmailDoCoMoResultParser, + ExpandedProductResultParser, GeoResultParser, ISBNResultParser, ParsedClientResult, + ParsedRXingResult, ProductResultParser, SMSMMSResultParser, SMTPResultParser, TelResultParser, + TextParsedRXingResult, URIResultParser, URLTOResultParser, VCardResultParser, + VEventResultParser, VINResultParser, WifiResultParser, SMSTOMMSTOResultParser, }; /** @@ -130,14 +131,14 @@ pub fn parseRXingResult(the_rxing_result: &RXingResult) -> ParsedClientResult { &SMTPResultParser::parse, &TelResultParser::parse, &SMSMMSResultParser::parse, - &SMSMMSResultParser::parse, + &SMSTOMMSTOResultParser::parse, &GeoResultParser::parse, &WifiResultParser::parse, &URLTOResultParser::parse, &URIResultParser::parse, &ISBNResultParser::parse, &ProductResultParser::parse, - & ExpandedProductResultParser::parse, + &ExpandedProductResultParser::parse, &VINResultParser::parse, ]; @@ -161,7 +162,9 @@ pub fn parseRXingResult(the_rxing_result: &RXingResult) -> ParsedClientResult { pub fn maybe_append_string(value: &str, result: &mut String) { if !value.is_empty() { - result.push('\n'); + if !result.is_empty() { + result.push('\n'); + } result.push_str(value); } } @@ -171,7 +174,9 @@ pub fn maybe_append_multiple(value: &[String], result: &mut String) { for s in value { // for (String s : value) { if !s.is_empty() { - result.push('\n'); + if !result.is_empty() { + result.push('\n'); + } result.push_str(s); } } diff --git a/src/client/result/SMSMMSResultParser.rs b/src/client/result/SMSMMSResultParser.rs index 3ce9e14..051d513 100644 --- a/src/client/result/SMSMMSResultParser.rs +++ b/src/client/result/SMSMMSResultParser.rs @@ -95,7 +95,7 @@ pub fn parse(result: &RXingResult) -> Option { add_number_via( &mut numbers, &mut vias, - &sms_uriwithout_query[(last_comma) as usize..], + &sms_uriwithout_query[(if last_comma > 0 { last_comma + 1} else {last_comma}) as usize..], ); Some(ParsedClientResult::SMSResult( diff --git a/src/client/result/SMSParsedResult.rs b/src/client/result/SMSParsedResult.rs index 276a8b3..bc1cef0 100644 --- a/src/client/result/SMSParsedResult.rs +++ b/src/client/result/SMSParsedResult.rs @@ -24,106 +24,100 @@ use super::{ParsedRXingResult, ParsedRXingResultType, ResultParser}; * * @author Sean Owen */ -pub struct SMSParsedRXingResult { - - numbers: Vec, - vias: Vec, - subject:String, - body:String, +pub struct SMSParsedRXingResult { + numbers: Vec, + vias: Vec, + subject: String, + body: String, } impl ParsedRXingResult for SMSParsedRXingResult { fn getType(&self) -> super::ParsedRXingResultType { - ParsedRXingResultType::SMS + ParsedRXingResultType::SMS } fn getDisplayRXingResult(&self) -> String { - let mut result = String::with_capacity(100); - ResultParser::maybe_append_multiple(&self.numbers, &mut result); - ResultParser::maybe_append_string(&self.subject, &mut result); - ResultParser::maybe_append_string(&self.body, &mut result); - result + let mut result = String::with_capacity(100); + ResultParser::maybe_append_multiple(&self.numbers, &mut result); + ResultParser::maybe_append_string(&self.subject, &mut result); + ResultParser::maybe_append_string(&self.body, &mut result); + result } - } impl SMSParsedRXingResult { - - pub fn with_singles( number:String, - via:String, - subject:String, - body:String) -> Self { - Self{ - numbers: vec![number], - vias: vec![via], - subject, - body, - } - } - - - - pub fn with_arrays( numbers :Vec, - vias:Vec, - subject:String, - body:String) -> Self{ - Self { - numbers, - vias, - subject, - body, - } - } - - pub fn getSMSURI(&self) -> String { - let mut result = String::new(); - result.push_str("sms:"); - let mut first = true; - for i in 0..self.numbers.len() { - // for (int i = 0; i < numbers.length; i++) { - if first { - first = false; - } else { - result.push(','); - } - result.push_str(&self.numbers[i]); - if !self.vias.is_empty() { - result.push_str(";via="); - result.push_str(&self.vias[i]); - } - } - let has_body = !self.body.is_empty(); - let has_subject = !self.subject.is_empty(); - if has_body || has_subject { - result.push('?'); - if has_body { - result.push_str("body="); - result.push_str(&self.body); - } - if has_subject { - if has_body { - result.push('&'); + pub fn with_singles(number: String, via: String, subject: String, body: String) -> Self { + Self { + numbers: vec![number], + vias: vec![via], + subject, + body, } - result.push_str("subject="); - result.push_str(&self.subject); - } } - result - } - pub fn getNumbers(&self) -> &Vec { - &self.numbers - } + pub fn with_arrays( + numbers: Vec, + vias: Vec, + subject: String, + body: String, + ) -> Self { + Self { + numbers, + vias, + subject, + body, + } + } - pub fn getVias(&self) -> &Vec { - &self. vias - } + pub fn getSMSURI(&self) -> String { + let mut result = String::new(); + result.push_str("sms:"); + let mut first = true; + for i in 0..self.numbers.len() { + // for (int i = 0; i < numbers.length; i++) { + if first { + first = false; + } else { + result.push(','); + } + result.push_str(&self.numbers[i]); + if !self.vias.is_empty() { + result.push_str(";via="); + result.push_str(&self.vias[i]); + } + } + let has_body = !self.body.is_empty(); + let has_subject = !self.subject.is_empty(); + if has_body || has_subject { + result.push('?'); + if has_body { + result.push_str("body="); + result.push_str(&self.body); + } + if has_subject { + if has_body { + result.push('&'); + } + result.push_str("subject="); + result.push_str(&self.subject); + } + } + result + } - pub fn getSubject(&self) -> &str { - &self. subject - } + pub fn getNumbers(&self) -> &Vec { + &self.numbers + } - pub fn getBody(&self) -> &str { - &self. body - } -} \ No newline at end of file + pub fn getVias(&self) -> &Vec { + &self.vias + } + + pub fn getSubject(&self) -> &str { + &self.subject + } + + pub fn getBody(&self) -> &str { + &self.body + } +}