mirror of
https://github.com/chatmail/core.git
synced 2026-05-05 22:36:30 +03:00
refactor(location): use bitflags for tags
This commit is contained in:
1
Cargo.lock
generated
1
Cargo.lock
generated
@@ -463,6 +463,7 @@ version = "1.0.0-alpha.4"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"backtrace 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
"backtrace 0.3.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cc 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.40 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"charset 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"charset 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ itertools = "0.8.0"
|
|||||||
image-meta = "0.1.0"
|
image-meta = "0.1.0"
|
||||||
quick-xml = "0.15.0"
|
quick-xml = "0.15.0"
|
||||||
escaper = "0.1.0"
|
escaper = "0.1.0"
|
||||||
|
bitflags = "1.1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tempfile = "3.0"
|
tempfile = "3.0"
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use bitflags::bitflags;
|
||||||
use quick_xml;
|
use quick_xml;
|
||||||
use quick_xml::events::{BytesEnd, BytesStart, BytesText};
|
use quick_xml::events::{BytesEnd, BytesStart, BytesText};
|
||||||
|
|
||||||
@@ -39,10 +40,22 @@ impl Location {
|
|||||||
pub struct Kml {
|
pub struct Kml {
|
||||||
pub addr: Option<String>,
|
pub addr: Option<String>,
|
||||||
pub locations: Option<Vec<Location>>,
|
pub locations: Option<Vec<Location>>,
|
||||||
pub tag: i32,
|
tag: KmlTag,
|
||||||
pub curr: Location,
|
pub curr: Location,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bitflags! {
|
||||||
|
#[derive(Default)]
|
||||||
|
struct KmlTag: i32 {
|
||||||
|
const UNDEFINED = 0x00;
|
||||||
|
const PLACEMARK = 0x01;
|
||||||
|
const TIMESTAMP = 0x02;
|
||||||
|
const WHEN = 0x04;
|
||||||
|
const POINT = 0x08;
|
||||||
|
const COORDINATES = 0x10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Kml {
|
impl Kml {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Default::default()
|
Default::default()
|
||||||
@@ -87,7 +100,7 @@ impl Kml {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn text_cb<B: std::io::BufRead>(&mut self, event: &BytesText, reader: &quick_xml::Reader<B>) {
|
fn text_cb<B: std::io::BufRead>(&mut self, event: &BytesText, reader: &quick_xml::Reader<B>) {
|
||||||
if 0 != self.tag & (0x4 | 0x10) {
|
if self.tag.contains(KmlTag::WHEN) || self.tag.contains(KmlTag::COORDINATES) {
|
||||||
let val = event.unescape_and_decode(reader).unwrap_or_default();
|
let val = event.unescape_and_decode(reader).unwrap_or_default();
|
||||||
|
|
||||||
let val = val
|
let val = val
|
||||||
@@ -96,7 +109,7 @@ impl Kml {
|
|||||||
.replace("\t", "")
|
.replace("\t", "")
|
||||||
.replace(" ", "");
|
.replace(" ", "");
|
||||||
|
|
||||||
if 0 != self.tag & 0x4 && val.len() >= 19 {
|
if self.tag.contains(KmlTag::WHEN) && val.len() >= 19 {
|
||||||
// YYYY-MM-DDTHH:MM:SSZ
|
// YYYY-MM-DDTHH:MM:SSZ
|
||||||
// 0 4 7 10 13 16 19
|
// 0 4 7 10 13 16 19
|
||||||
match chrono::NaiveDateTime::parse_from_str(&val, "%Y-%m-%dT%H:%M:%SZ") {
|
match chrono::NaiveDateTime::parse_from_str(&val, "%Y-%m-%dT%H:%M:%SZ") {
|
||||||
@@ -110,7 +123,7 @@ impl Kml {
|
|||||||
self.curr.timestamp = time();
|
self.curr.timestamp = time();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if 0 != self.tag & 0x10 {
|
} else if self.tag.contains(KmlTag::COORDINATES) {
|
||||||
let parts = val.splitn(2, ',').collect::<Vec<_>>();
|
let parts = val.splitn(2, ',').collect::<Vec<_>>();
|
||||||
if parts.len() == 2 {
|
if parts.len() == 2 {
|
||||||
self.curr.longitude = parts[0].parse().unwrap_or_default();
|
self.curr.longitude = parts[0].parse().unwrap_or_default();
|
||||||
@@ -124,7 +137,7 @@ impl Kml {
|
|||||||
let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase();
|
let tag = String::from_utf8_lossy(event.name()).trim().to_lowercase();
|
||||||
|
|
||||||
if tag == "placemark" {
|
if tag == "placemark" {
|
||||||
if 0 != self.tag & 0x1
|
if self.tag.contains(KmlTag::PLACEMARK)
|
||||||
&& 0 != self.curr.timestamp
|
&& 0 != self.curr.timestamp
|
||||||
&& 0. != self.curr.latitude
|
&& 0. != self.curr.latitude
|
||||||
&& 0. != self.curr.longitude
|
&& 0. != self.curr.longitude
|
||||||
@@ -133,7 +146,7 @@ impl Kml {
|
|||||||
locations.push(std::mem::replace(&mut self.curr, Location::new()));
|
locations.push(std::mem::replace(&mut self.curr, Location::new()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
self.tag = 0
|
self.tag = KmlTag::UNDEFINED;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,19 +165,19 @@ impl Kml {
|
|||||||
self.addr = addr.unwrap().unescape_and_decode_value(reader).ok();
|
self.addr = addr.unwrap().unescape_and_decode_value(reader).ok();
|
||||||
}
|
}
|
||||||
} else if tag == "placemark" {
|
} else if tag == "placemark" {
|
||||||
self.tag = 0x1;
|
self.tag = KmlTag::PLACEMARK;
|
||||||
self.curr.timestamp = 0;
|
self.curr.timestamp = 0;
|
||||||
self.curr.latitude = 0.0;
|
self.curr.latitude = 0.0;
|
||||||
self.curr.longitude = 0.0;
|
self.curr.longitude = 0.0;
|
||||||
self.curr.accuracy = 0.0
|
self.curr.accuracy = 0.0
|
||||||
} else if tag == "timestamp" && 0 != self.tag & 0x1 {
|
} else if tag == "timestamp" && self.tag.contains(KmlTag::PLACEMARK) {
|
||||||
self.tag = 0x1 | 0x2
|
self.tag = KmlTag::PLACEMARK | KmlTag::TIMESTAMP
|
||||||
} else if tag == "when" && 0 != self.tag & 0x2 {
|
} else if tag == "when" && self.tag.contains(KmlTag::TIMESTAMP) {
|
||||||
self.tag = 0x1 | 0x2 | 0x4
|
self.tag = KmlTag::PLACEMARK | KmlTag::TIMESTAMP | KmlTag::WHEN
|
||||||
} else if tag == "point" && 0 != self.tag & 0x1 {
|
} else if tag == "point" && self.tag.contains(KmlTag::PLACEMARK) {
|
||||||
self.tag = 0x1 | 0x8
|
self.tag = KmlTag::PLACEMARK | KmlTag::POINT
|
||||||
} else if tag == "coordinates" && 0 != self.tag & 0x8 {
|
} else if tag == "coordinates" && self.tag.contains(KmlTag::POINT) {
|
||||||
self.tag = 0x1 | 0x8 | 0x10;
|
self.tag = KmlTag::PLACEMARK | KmlTag::POINT | KmlTag::COORDINATES;
|
||||||
if let Some(acc) = event.attributes().find(|attr| {
|
if let Some(acc) = event.attributes().find(|attr| {
|
||||||
attr.as_ref()
|
attr.as_ref()
|
||||||
.map(|a| String::from_utf8_lossy(a.key).trim().to_lowercase() == "accuracy")
|
.map(|a| String::from_utf8_lossy(a.key).trim().to_lowercase() == "accuracy")
|
||||||
|
|||||||
Reference in New Issue
Block a user