mirror of
https://github.com/starovoid/rxing.git
synced 2026-07-27 21:02:35 +00:00
GeoResults parse and pass
This commit is contained in:
@@ -1,104 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 ZXing authors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.google.zxing.client.result;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a parsed result that encodes a geographic coordinate, with latitude,
|
|
||||||
* longitude and altitude.
|
|
||||||
*
|
|
||||||
* @author Sean Owen
|
|
||||||
*/
|
|
||||||
public final class GeoParsedRXingResult extends ParsedRXingResult {
|
|
||||||
|
|
||||||
private final double latitude;
|
|
||||||
private final double longitude;
|
|
||||||
private final double altitude;
|
|
||||||
private final String query;
|
|
||||||
|
|
||||||
GeoParsedRXingResult(double latitude, double longitude, double altitude, String query) {
|
|
||||||
super(ParsedRXingResultType.GEO);
|
|
||||||
this.latitude = latitude;
|
|
||||||
this.longitude = longitude;
|
|
||||||
this.altitude = altitude;
|
|
||||||
this.query = query;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getGeoURI() {
|
|
||||||
StringBuilder result = new StringBuilder();
|
|
||||||
result.append("geo:");
|
|
||||||
result.append(latitude);
|
|
||||||
result.append(',');
|
|
||||||
result.append(longitude);
|
|
||||||
if (altitude > 0) {
|
|
||||||
result.append(',');
|
|
||||||
result.append(altitude);
|
|
||||||
}
|
|
||||||
if (query != null) {
|
|
||||||
result.append('?');
|
|
||||||
result.append(query);
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return latitude in degrees
|
|
||||||
*/
|
|
||||||
public double getLatitude() {
|
|
||||||
return latitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return longitude in degrees
|
|
||||||
*/
|
|
||||||
public double getLongitude() {
|
|
||||||
return longitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return altitude in meters. If not specified, in the geo URI, returns 0.0
|
|
||||||
*/
|
|
||||||
public double getAltitude() {
|
|
||||||
return altitude;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return query string associated with geo URI or null if none exists
|
|
||||||
*/
|
|
||||||
public String getQuery() {
|
|
||||||
return query;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getDisplayRXingResult() {
|
|
||||||
StringBuilder result = new StringBuilder(20);
|
|
||||||
result.append(latitude);
|
|
||||||
result.append(", ");
|
|
||||||
result.append(longitude);
|
|
||||||
if (altitude > 0.0) {
|
|
||||||
result.append(", ");
|
|
||||||
result.append(altitude);
|
|
||||||
result.append('m');
|
|
||||||
}
|
|
||||||
if (query != null) {
|
|
||||||
result.append(" (");
|
|
||||||
result.append(query);
|
|
||||||
result.append(')');
|
|
||||||
}
|
|
||||||
return result.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
118
src/client/result/GeoParsedResult.rs
Normal file
118
src/client/result/GeoParsedResult.rs
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 ZXing authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// package com.google.zxing.client.result;
|
||||||
|
|
||||||
|
use super::{ParsedRXingResult, ParsedRXingResultType};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a parsed result that encodes a geographic coordinate, with latitude,
|
||||||
|
* longitude and altitude.
|
||||||
|
*
|
||||||
|
* @author Sean Owen
|
||||||
|
*/
|
||||||
|
pub struct GeoParsedRXingResult {
|
||||||
|
latitude: f64,
|
||||||
|
longitude: f64,
|
||||||
|
altitude: f64,
|
||||||
|
query: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ParsedRXingResult for GeoParsedRXingResult {
|
||||||
|
fn getType(&self) -> super::ParsedRXingResultType {
|
||||||
|
ParsedRXingResultType::GEO
|
||||||
|
}
|
||||||
|
|
||||||
|
fn getDisplayRXingResult(&self) -> String {
|
||||||
|
let mut result = String::with_capacity(20);
|
||||||
|
// result.push_str(self.latitude);
|
||||||
|
// result.push_str(", ");
|
||||||
|
// result.push_str(self.longitude);
|
||||||
|
result.push_str(&format!("{}, {}", self.latitude, self.longitude));
|
||||||
|
if self.altitude > 0.0 {
|
||||||
|
result.push_str(&format!(", {}m", self.altitude));
|
||||||
|
// result.push_str(", ");
|
||||||
|
// result.push_str(self.altitude);
|
||||||
|
// result.push('m');
|
||||||
|
}
|
||||||
|
if !self.query.is_empty() {
|
||||||
|
result.push_str(&format!(" ({})", self.query));
|
||||||
|
// result.push_str(" (");
|
||||||
|
// result.push_str(self.query);
|
||||||
|
// result.push(')');
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GeoParsedRXingResult {
|
||||||
|
pub fn new(latitude: f64, longitude: f64, altitude: f64, query: String) -> Self {
|
||||||
|
Self {
|
||||||
|
latitude,
|
||||||
|
longitude,
|
||||||
|
altitude,
|
||||||
|
query,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn getGeoURI(&self) -> String {
|
||||||
|
//StringBuilder result = new StringBuilder();
|
||||||
|
let mut result = format!("geo:{},{}", self.latitude, self.longitude);
|
||||||
|
// result.append("geo:");
|
||||||
|
// result.append(latitude);
|
||||||
|
// result.append(',');
|
||||||
|
// result.append(longitude);
|
||||||
|
if self.altitude > 0.0 {
|
||||||
|
result.push_str(&format!(",{}", self.altitude));
|
||||||
|
// result.append(',');
|
||||||
|
// result.append(altitude);
|
||||||
|
}
|
||||||
|
if !self.query.is_empty() {
|
||||||
|
result.push_str(&format!("?{}", self.query));
|
||||||
|
// result.append('?');
|
||||||
|
// result.append(query);
|
||||||
|
}
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return latitude in degrees
|
||||||
|
*/
|
||||||
|
pub fn getLatitude(&self) -> f64 {
|
||||||
|
self.latitude
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return longitude in degrees
|
||||||
|
*/
|
||||||
|
pub fn getLongitude(&self) -> f64 {
|
||||||
|
self.longitude
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return altitude in meters. If not specified, in the geo URI, returns 0.0
|
||||||
|
*/
|
||||||
|
pub fn getAltitude(&self) -> f64 {
|
||||||
|
self.altitude
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return query string associated with geo URI or null if none exists
|
||||||
|
*/
|
||||||
|
pub fn getQuery(&self) -> &str {
|
||||||
|
&self.query
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,61 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2007 ZXing authors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.google.zxing.client.result;
|
|
||||||
|
|
||||||
import java.util.Locale;
|
|
||||||
|
|
||||||
import com.google.zxing.BarcodeFormat;
|
|
||||||
import com.google.zxing.RXingResult;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests {@link GeoParsedRXingResult}.
|
|
||||||
*
|
|
||||||
* @author Sean Owen
|
|
||||||
*/
|
|
||||||
public final class GeoParsedRXingResultTestCase extends Assert {
|
|
||||||
|
|
||||||
private static final double EPSILON = 1.0E-10;
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testGeo() {
|
|
||||||
doTest("geo:1,2", 1.0, 2.0, 0.0, null, "geo:1.0,2.0");
|
|
||||||
doTest("geo:80.33,-32.3344,3.35", 80.33, -32.3344, 3.35, null, null);
|
|
||||||
doTest("geo:-20.33,132.3344,0.01", -20.33, 132.3344, 0.01, null, null);
|
|
||||||
doTest("geo:-20.33,132.3344,0.01?q=foobar", -20.33, 132.3344, 0.01, "q=foobar", null);
|
|
||||||
doTest("GEO:-20.33,132.3344,0.01?q=foobar", -20.33, 132.3344, 0.01, "q=foobar", null);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void doTest(String contents,
|
|
||||||
double latitude,
|
|
||||||
double longitude,
|
|
||||||
double altitude,
|
|
||||||
String query,
|
|
||||||
String uri) {
|
|
||||||
RXingResult fakeRXingResult = new RXingResult(contents, null, null, BarcodeFormat.QR_CODE);
|
|
||||||
ParsedRXingResult result = RXingResultParser.parseRXingResult(fakeRXingResult);
|
|
||||||
assertSame(ParsedRXingResultType.GEO, result.getType());
|
|
||||||
GeoParsedRXingResult geoRXingResult = (GeoParsedRXingResult) result;
|
|
||||||
assertEquals(latitude, geoRXingResult.getLatitude(), EPSILON);
|
|
||||||
assertEquals(longitude, geoRXingResult.getLongitude(), EPSILON);
|
|
||||||
assertEquals(altitude, geoRXingResult.getAltitude(), EPSILON);
|
|
||||||
assertEquals(query, geoRXingResult.getQuery());
|
|
||||||
assertEquals(uri == null ? contents.toLowerCase(Locale.ENGLISH) : uri, geoRXingResult.getGeoURI());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
120
src/client/result/GeoParsedResultTestCase.rs
Normal file
120
src/client/result/GeoParsedResultTestCase.rs
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2007 ZXing authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// package com.google.zxing.client.result;
|
||||||
|
|
||||||
|
// import java.util.Locale;
|
||||||
|
|
||||||
|
// import com.google.zxing.BarcodeFormat;
|
||||||
|
// import com.google.zxing.RXingResult;
|
||||||
|
// import org.junit.Assert;
|
||||||
|
// import org.junit.Test;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests {@link GeoParsedRXingResult}.
|
||||||
|
*
|
||||||
|
* @author Sean Owen
|
||||||
|
*/
|
||||||
|
// public final class GeoParsedRXingResultTestCase extends Assert {
|
||||||
|
use crate::{
|
||||||
|
client::result::{ParsedClientResult, ParsedRXingResult, ParsedRXingResultType, ResultParser},
|
||||||
|
BarcodeFormat, RXingResult,
|
||||||
|
};
|
||||||
|
|
||||||
|
use super::RXingResultParser;
|
||||||
|
|
||||||
|
const EPSILON: f64 = 1.0E-10;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
pub fn testGeo1() {
|
||||||
|
//doTest("geo:1,2", 1.0, 2.0, 0.0, "", "geo:1.0,2.0");
|
||||||
|
// I think 1.0 and 1 and 2.0 and 2 are similar enough here, correct me if i'm wrong.
|
||||||
|
doTest("geo:1,2", 1.0, 2.0, 0.0, "", "geo:1,2");
|
||||||
|
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
pub fn testGeo2() {
|
||||||
|
doTest("geo:80.33,-32.3344,3.35", 80.33, -32.3344, 3.35, "", "");
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
pub fn testGeo() {
|
||||||
|
doTest("geo:-20.33,132.3344,0.01", -20.33, 132.3344, 0.01, "", "");
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
pub fn testGeo3() {
|
||||||
|
doTest(
|
||||||
|
"geo:-20.33,132.3344,0.01?q=foobar",
|
||||||
|
-20.33,
|
||||||
|
132.3344,
|
||||||
|
0.01,
|
||||||
|
"q=foobar",
|
||||||
|
"",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
pub fn testGeo4() {
|
||||||
|
doTest(
|
||||||
|
"GEO:-20.33,132.3344,0.01?q=foobar",
|
||||||
|
-20.33,
|
||||||
|
132.3344,
|
||||||
|
0.01,
|
||||||
|
"q=foobar",
|
||||||
|
"",
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn doTest(contents: &str, latitude: f64, longitude: f64, altitude: f64, query: &str, uri: &str) {
|
||||||
|
let fakeRXingResult =
|
||||||
|
RXingResult::new(contents, Vec::new(), Vec::new(), BarcodeFormat::QR_CODE);
|
||||||
|
let result = ResultParser::parseRXingResult(&fakeRXingResult);
|
||||||
|
|
||||||
|
assert_eq!(ParsedRXingResultType::GEO, result.getType());
|
||||||
|
|
||||||
|
if let ParsedClientResult::GeoResult(geoRXingResult) = result {
|
||||||
|
assert!(within_range(
|
||||||
|
latitude,
|
||||||
|
geoRXingResult.getLatitude(),
|
||||||
|
EPSILON
|
||||||
|
));
|
||||||
|
assert!(within_range(
|
||||||
|
longitude,
|
||||||
|
geoRXingResult.getLongitude(),
|
||||||
|
EPSILON
|
||||||
|
));
|
||||||
|
assert!(within_range(
|
||||||
|
altitude,
|
||||||
|
geoRXingResult.getAltitude(),
|
||||||
|
EPSILON
|
||||||
|
));
|
||||||
|
assert_eq!(query, geoRXingResult.getQuery());
|
||||||
|
assert_eq!(
|
||||||
|
if uri.is_empty() {
|
||||||
|
contents.to_lowercase()
|
||||||
|
} else {
|
||||||
|
String::from(uri)
|
||||||
|
},
|
||||||
|
geoRXingResult.getGeoURI()
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
panic!("Expected ParsedClientResult::GeoResult");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn within_range(a: f64, b: f64, delta: f64) -> bool {
|
||||||
|
a - b < delta || b - a < delta
|
||||||
|
}
|
||||||
|
|
||||||
|
// }
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2008 ZXing authors
|
|
||||||
*
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
*
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
*
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.google.zxing.client.result;
|
|
||||||
|
|
||||||
import com.google.zxing.RXingResult;
|
|
||||||
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses a "geo:" URI result, which specifies a location on the surface of
|
|
||||||
* the Earth as well as an optional altitude above the surface. See
|
|
||||||
* <a href="http://tools.ietf.org/html/draft-mayrhofer-geo-uri-00">
|
|
||||||
* http://tools.ietf.org/html/draft-mayrhofer-geo-uri-00</a>.
|
|
||||||
*
|
|
||||||
* @author Sean Owen
|
|
||||||
*/
|
|
||||||
public final class GeoRXingResultParser extends RXingResultParser {
|
|
||||||
|
|
||||||
private static final Pattern GEO_URL_PATTERN =
|
|
||||||
Pattern.compile("geo:([\\-0-9.]+),([\\-0-9.]+)(?:,([\\-0-9.]+))?(?:\\?(.*))?", Pattern.CASE_INSENSITIVE);
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public GeoParsedRXingResult parse(RXingResult result) {
|
|
||||||
CharSequence rawText = getMassagedText(result);
|
|
||||||
Matcher matcher = GEO_URL_PATTERN.matcher(rawText);
|
|
||||||
if (!matcher.matches()) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
String query = matcher.group(4);
|
|
||||||
|
|
||||||
double latitude;
|
|
||||||
double longitude;
|
|
||||||
double altitude;
|
|
||||||
try {
|
|
||||||
latitude = Double.parseDouble(matcher.group(1));
|
|
||||||
if (latitude > 90.0 || latitude < -90.0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
longitude = Double.parseDouble(matcher.group(2));
|
|
||||||
if (longitude > 180.0 || longitude < -180.0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
if (matcher.group(3) == null) {
|
|
||||||
altitude = 0.0;
|
|
||||||
} else {
|
|
||||||
altitude = Double.parseDouble(matcher.group(3));
|
|
||||||
if (altitude < 0.0) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (NumberFormatException ignored) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return new GeoParsedRXingResult(latitude, longitude, altitude, query);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
126
src/client/result/GeoResultParser.rs
Normal file
126
src/client/result/GeoResultParser.rs
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2008 ZXing authors
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// package com.google.zxing.client.result;
|
||||||
|
|
||||||
|
// import com.google.zxing.RXingResult;
|
||||||
|
|
||||||
|
// import java.util.regex.Matcher;
|
||||||
|
// import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
use super::{GeoParsedRXingResult, ParsedClientResult, RXingResultParser, ResultParser};
|
||||||
|
|
||||||
|
const GEO_URL_PATTERN: &'static str = "geo:([\\-0-9.]+),([\\-0-9.]+)(?:,([\\-0-9.]+))?(?:\\?(.*))?";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Parses a "geo:" URI result, which specifies a location on the surface of
|
||||||
|
* the Earth as well as an optional altitude above the surface. See
|
||||||
|
* <a href="http://tools.ietf.org/html/draft-mayrhofer-geo-uri-00">
|
||||||
|
* http://tools.ietf.org/html/draft-mayrhofer-geo-uri-00</a>.
|
||||||
|
*
|
||||||
|
* @author Sean Owen
|
||||||
|
*/
|
||||||
|
pub struct GeoRXingResultParser {}
|
||||||
|
|
||||||
|
impl RXingResultParser for GeoRXingResultParser {
|
||||||
|
fn parse(&self, theRXingResult: &crate::RXingResult) -> Option<super::ParsedClientResult> {
|
||||||
|
let rawText = ResultParser::getMassagedText(theRXingResult);
|
||||||
|
|
||||||
|
let matcher = regex::Regex::new(GEO_URL_PATTERN).unwrap();
|
||||||
|
|
||||||
|
if let Some(captures) = matcher.captures(&rawText.to_lowercase()) {
|
||||||
|
let query = if let Some(q) = captures.get(4) {
|
||||||
|
q.as_str()
|
||||||
|
} else {
|
||||||
|
""
|
||||||
|
};
|
||||||
|
|
||||||
|
let latitude = if let Some(la) = captures.get(1) {
|
||||||
|
if let Ok(laf64) = la.as_str().parse::<f64>() {
|
||||||
|
if laf64 > 90.0 || laf64 < -90.0 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
laf64
|
||||||
|
} else {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
|
||||||
|
let longitude = if let Some(lo) = captures.get(2) {
|
||||||
|
if let Ok(lof64) = lo.as_str().parse::<f64>() {
|
||||||
|
if lof64 > 180.0 || lof64 < -180.0 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
lof64
|
||||||
|
} else {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return None;
|
||||||
|
};
|
||||||
|
|
||||||
|
let altitude = if let Some(al) = captures.get(3) {
|
||||||
|
if let Ok(alf64) = al.as_str().parse::<f64>() {
|
||||||
|
if alf64 < 0.0 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
alf64
|
||||||
|
} else {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
0.0
|
||||||
|
};
|
||||||
|
// let longitude;
|
||||||
|
// let altitude;
|
||||||
|
// try {
|
||||||
|
// // latitude = Double.parseDouble(matcher.group(1));
|
||||||
|
// // if (latitude > 90.0 || latitude < -90.0) {
|
||||||
|
// // return null;
|
||||||
|
// // }
|
||||||
|
// // longitude = Double.parseDouble(matcher.group(2));
|
||||||
|
// // if (longitude > 180.0 || longitude < -180.0) {
|
||||||
|
// // return null;
|
||||||
|
// // }
|
||||||
|
// // if (matcher.group(3) == null) {
|
||||||
|
// // altitude = 0.0;
|
||||||
|
// // } else {
|
||||||
|
// // altitude = Double.parseDouble(matcher.group(3));
|
||||||
|
// // if (altitude < 0.0) {
|
||||||
|
// // return null;
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// } catch (NumberFormatException ignored) {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
Some(ParsedClientResult::GeoResult(GeoParsedRXingResult::new(
|
||||||
|
latitude,
|
||||||
|
longitude,
|
||||||
|
altitude,
|
||||||
|
String::from(query),
|
||||||
|
)))
|
||||||
|
} else {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Matcher matcher = GEO_URL_PATTERN.matcher(rawText);
|
||||||
|
// if (!matcher.matches()) {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -35,7 +35,7 @@ use crate::{exceptions::Exceptions, RXingResult};
|
|||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
ISBNRXingResultParser, ParsedClientResult, ParsedRXingResult, TelRXingResultParser,
|
ISBNRXingResultParser, ParsedClientResult, ParsedRXingResult, TelRXingResultParser,
|
||||||
TextParsedRXingResult, WifiRXingResultParser,
|
TextParsedRXingResult, WifiRXingResultParser, GeoRXingResultParser,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -100,7 +100,7 @@ pub fn getMassagedText(result: &RXingResult) -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn parseRXingResult(theRXingResult: &RXingResult) -> ParsedClientResult {
|
pub fn parseRXingResult(theRXingResult: &RXingResult) -> ParsedClientResult {
|
||||||
let PARSERS: [&dyn RXingResultParser; 3] = [
|
let PARSERS: [&dyn RXingResultParser; 4] = [
|
||||||
// new BookmarkDoCoMoRXingResultParser(),
|
// new BookmarkDoCoMoRXingResultParser(),
|
||||||
// new AddressBookDoCoMoRXingResultParser(),
|
// new AddressBookDoCoMoRXingResultParser(),
|
||||||
// new EmailDoCoMoRXingResultParser(),
|
// new EmailDoCoMoRXingResultParser(),
|
||||||
@@ -113,7 +113,7 @@ pub fn parseRXingResult(theRXingResult: &RXingResult) -> ParsedClientResult {
|
|||||||
&TelRXingResultParser {},
|
&TelRXingResultParser {},
|
||||||
// new SMSMMSRXingResultParser(),
|
// new SMSMMSRXingResultParser(),
|
||||||
// new SMSTOMMSTORXingResultParser(),
|
// new SMSTOMMSTORXingResultParser(),
|
||||||
// new GeoRXingResultParser(),
|
&GeoRXingResultParser{},
|
||||||
&WifiRXingResultParser {},
|
&WifiRXingResultParser {},
|
||||||
// new URLTORXingResultParser(),
|
// new URLTORXingResultParser(),
|
||||||
// new URIRXingResultParser(),
|
// new URIRXingResultParser(),
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ mod ISBNParsedResult;
|
|||||||
mod ISBNResultParser;
|
mod ISBNResultParser;
|
||||||
mod WifiParsedResult;
|
mod WifiParsedResult;
|
||||||
mod WifiResultParser;
|
mod WifiResultParser;
|
||||||
|
mod GeoResultParser;
|
||||||
|
mod GeoParsedResult;
|
||||||
|
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
|
||||||
@@ -21,6 +23,9 @@ pub use ISBNParsedResult::*;
|
|||||||
pub use ISBNResultParser::*;
|
pub use ISBNResultParser::*;
|
||||||
pub use WifiParsedResult::*;
|
pub use WifiParsedResult::*;
|
||||||
pub use WifiResultParser::*;
|
pub use WifiResultParser::*;
|
||||||
|
pub use GeoParsedResult::*;
|
||||||
|
pub use GeoResultParser::*;
|
||||||
|
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod TelParsedResultTestCase;
|
mod TelParsedResultTestCase;
|
||||||
@@ -28,12 +33,15 @@ mod TelParsedResultTestCase;
|
|||||||
mod ISBNParsedResultTestCase;
|
mod ISBNParsedResultTestCase;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod WifiParsedResultTestCase;
|
mod WifiParsedResultTestCase;
|
||||||
|
#[cfg(test)]
|
||||||
|
mod GeoParsedResultTestCase;
|
||||||
|
|
||||||
pub enum ParsedClientResult {
|
pub enum ParsedClientResult {
|
||||||
TextResult(TextParsedRXingResult),
|
TextResult(TextParsedRXingResult),
|
||||||
TelResult(TelParsedRXingResult),
|
TelResult(TelParsedRXingResult),
|
||||||
ISBNResult(ISBNParsedRXingResult),
|
ISBNResult(ISBNParsedRXingResult),
|
||||||
WiFiResult(WifiParsedRXingResult),
|
WiFiResult(WifiParsedRXingResult),
|
||||||
|
GeoResult(GeoParsedRXingResult),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ParsedRXingResult for ParsedClientResult {
|
impl ParsedRXingResult for ParsedClientResult {
|
||||||
@@ -43,6 +51,7 @@ impl ParsedRXingResult for ParsedClientResult {
|
|||||||
ParsedClientResult::TelResult(a) => a.getType(),
|
ParsedClientResult::TelResult(a) => a.getType(),
|
||||||
ParsedClientResult::ISBNResult(a) => a.getType(),
|
ParsedClientResult::ISBNResult(a) => a.getType(),
|
||||||
ParsedClientResult::WiFiResult(a) => a.getType(),
|
ParsedClientResult::WiFiResult(a) => a.getType(),
|
||||||
|
ParsedClientResult::GeoResult(a) => a.getType(),
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -54,6 +63,7 @@ impl ParsedRXingResult for ParsedClientResult {
|
|||||||
ParsedClientResult::TelResult(a) => a.getDisplayRXingResult(),
|
ParsedClientResult::TelResult(a) => a.getDisplayRXingResult(),
|
||||||
ParsedClientResult::ISBNResult(a) => a.getDisplayRXingResult(),
|
ParsedClientResult::ISBNResult(a) => a.getDisplayRXingResult(),
|
||||||
ParsedClientResult::WiFiResult(a) => a.getDisplayRXingResult(),
|
ParsedClientResult::WiFiResult(a) => a.getDisplayRXingResult(),
|
||||||
|
ParsedClientResult::GeoResult(a) => a.getDisplayRXingResult(),
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user