diff --git a/emseries/src/criteria.rs b/emseries/src/criteria.rs
index fab7945..9f304e6 100644
--- a/emseries/src/criteria.rs
+++ b/emseries/src/criteria.rs
@@ -10,7 +10,6 @@ Luminescent Dreams Tools is distributed in the hope that it will be useful, but
You should have received a copy of the GNU General Public License along with Lumeto. If not, see .
*/
-use date_time_tz::DateTimeTz;
use types::{Recordable, Timestamp};
/// This trait is used for constructing queries for searching the database.
diff --git a/emseries/src/date_time_tz.rs b/emseries/src/date_time_tz.rs
index 2ef3607..1022767 100644
--- a/emseries/src/date_time_tz.rs
+++ b/emseries/src/date_time_tz.rs
@@ -33,19 +33,13 @@ use std::{fmt, str::FromStr};
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct DateTimeTz(pub chrono::DateTime);
-impl DateTimeTz {
- pub fn map(&self, f: F) -> DateTimeTz
- where
- F: FnOnce(chrono::DateTime) -> chrono::DateTime,
- {
- DateTimeTz(f(self.0))
- }
-
- pub fn to_string(&self) -> String {
+impl fmt::Display for DateTimeTz {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
if self.0.timezone() == UTC {
- self.0.to_rfc3339_opts(SecondsFormat::Secs, true)
+ write!(f, "{}", self.0.to_rfc3339_opts(SecondsFormat::Secs, true))
} else {
- format!(
+ write!(
+ f,
"{} {}",
self.0
.with_timezone(&chrono_tz::Etc::UTC)
@@ -56,11 +50,20 @@ impl DateTimeTz {
}
}
+impl DateTimeTz {
+ pub fn map(&self, f: F) -> DateTimeTz
+ where
+ F: FnOnce(chrono::DateTime) -> chrono::DateTime,
+ {
+ DateTimeTz(f(self.0))
+ }
+}
+
impl std::str::FromStr for DateTimeTz {
type Err = chrono::ParseError;
fn from_str(s: &str) -> Result {
- let v: Vec<&str> = s.split_terminator(" ").collect();
+ let v: Vec<&str> = s.split_terminator(' ').collect();
if v.len() == 2 {
let tz = v[1].parse::().unwrap();
chrono::DateTime::parse_from_rfc3339(v[0]).map(|ts| DateTimeTz(ts.with_timezone(&tz)))
@@ -86,9 +89,9 @@ impl<'de> Visitor<'de> for DateTimeTzVisitor {
}
fn visit_str(self, s: &str) -> Result {
- DateTimeTz::from_str(s).or(Err(E::custom(format!(
- "string is not a parsable datetime representation"
- ))))
+ DateTimeTz::from_str(s).or(Err(E::custom(
+ "string is not a parsable datetime representation".to_owned(),
+ )))
}
}
@@ -117,28 +120,43 @@ mod test {
#[test]
fn it_creates_timestamp_with_z() {
- let t = DateTimeTz(UTC.ymd(2019, 5, 15).and_hms(12, 0, 0));
+ let t = DateTimeTz(UTC.with_ymd_and_hms(2019, 5, 15, 12, 0, 0).unwrap());
assert_eq!(t.to_string(), "2019-05-15T12:00:00Z");
}
#[test]
fn it_parses_utc_rfc3339_z() {
let t = DateTimeTz::from_str("2019-05-15T12:00:00Z").unwrap();
- assert_eq!(t, DateTimeTz(UTC.ymd(2019, 5, 15).and_hms(12, 0, 0)));
+ assert_eq!(
+ t,
+ DateTimeTz(UTC.with_ymd_and_hms(2019, 5, 15, 12, 0, 0).unwrap())
+ );
}
#[test]
fn it_parses_rfc3339_with_offset() {
let t = DateTimeTz::from_str("2019-05-15T12:00:00-06:00").unwrap();
- assert_eq!(t, DateTimeTz(UTC.ymd(2019, 5, 15).and_hms(18, 0, 0)));
+ assert_eq!(
+ t,
+ DateTimeTz(UTC.with_ymd_and_hms(2019, 5, 15, 18, 0, 0).unwrap())
+ );
}
#[test]
fn it_parses_rfc3339_with_tz() {
let t = DateTimeTz::from_str("2019-06-15T19:00:00Z US/Arizona").unwrap();
- assert_eq!(t, DateTimeTz(UTC.ymd(2019, 6, 15).and_hms(19, 0, 0)));
- assert_eq!(t, DateTimeTz(Arizona.ymd(2019, 6, 15).and_hms(12, 0, 0)));
- assert_eq!(t, DateTimeTz(Central.ymd(2019, 6, 15).and_hms(14, 0, 0)));
+ assert_eq!(
+ t,
+ DateTimeTz(UTC.with_ymd_and_hms(2019, 6, 15, 19, 0, 0).unwrap())
+ );
+ assert_eq!(
+ t,
+ DateTimeTz(Arizona.with_ymd_and_hms(2019, 6, 15, 12, 0, 0).unwrap())
+ );
+ assert_eq!(
+ t,
+ DateTimeTz(Central.with_ymd_and_hms(2019, 6, 15, 14, 0, 0).unwrap())
+ );
assert_eq!(t.to_string(), "2019-06-15T19:00:00Z US/Arizona");
}
@@ -172,6 +190,9 @@ mod test {
fn it_json_parses() {
let t =
serde_json::from_str::("\"2019-06-15T19:00:00Z America/Phoenix\"").unwrap();
- assert_eq!(t, DateTimeTz(Phoenix.ymd(2019, 6, 15).and_hms(12, 0, 0)));
+ assert_eq!(
+ t,
+ DateTimeTz(Phoenix.with_ymd_and_hms(2019, 6, 15, 12, 0, 0).unwrap())
+ );
}
}
diff --git a/emseries/src/series.rs b/emseries/src/series.rs
index 8fad160..71e089f 100644
--- a/emseries/src/series.rs
+++ b/emseries/src/series.rs
@@ -47,7 +47,7 @@ where
.read(true)
.append(true)
.create(true)
- .open(&path)
+ .open(path)
.map_err(EmseriesReadError::IOError)?;
let records = Series::load_file(&f)?;
@@ -88,8 +88,8 @@ where
/// Put a new record into the database. A unique id will be assigned to the record and
/// returned.
pub fn put(&mut self, entry: T) -> Result {
- let uuid = UniqueId::new();
- self.update(uuid.clone(), entry).and_then(|_| Ok(uuid))
+ let uuid = UniqueId::default();
+ self.update(uuid.clone(), entry).map(|_| uuid)
}
/// Update an existing record. The `UniqueId` of the record passed into this function must match
@@ -138,7 +138,7 @@ where
}
/// Get all of the records in the database.
- pub fn records<'s>(&'s self) -> impl Iterator- + 's {
+ pub fn records(&self) -> impl Iterator
- {
self.records.iter()
}
@@ -166,7 +166,7 @@ where
/// Get an exact record from the database based on unique id.
pub fn get(&self, uuid: &UniqueId) -> Option {
- self.records.get(uuid).map(|v| v.clone())
+ self.records.get(uuid).cloned()
}
/*
diff --git a/emseries/src/types.rs b/emseries/src/types.rs
index a2a1606..2b72c73 100644
--- a/emseries/src/types.rs
+++ b/emseries/src/types.rs
@@ -55,8 +55,8 @@ impl str::FromStr for Timestamp {
type Err = chrono::ParseError;
fn from_str(line: &str) -> Result {
DateTimeTz::from_str(line)
- .map(|dtz| Timestamp::DateTime(dtz))
- .or(NaiveDate::from_str(line).map(|d| Timestamp::Date(d)))
+ .map(Timestamp::DateTime)
+ .or(NaiveDate::from_str(line).map(Timestamp::Date))
}
}
@@ -70,8 +70,8 @@ impl Ord for Timestamp {
fn cmp(&self, other: &Timestamp) -> Ordering {
match (self, other) {
(Timestamp::DateTime(dt1), Timestamp::DateTime(dt2)) => dt1.cmp(dt2),
- (Timestamp::DateTime(dt1), Timestamp::Date(dt2)) => dt1.0.date().naive_utc().cmp(&dt2),
- (Timestamp::Date(dt1), Timestamp::DateTime(dt2)) => dt1.cmp(&dt2.0.date().naive_utc()),
+ (Timestamp::DateTime(dt1), Timestamp::Date(dt2)) => dt1.0.date_naive().cmp(dt2),
+ (Timestamp::Date(dt1), Timestamp::DateTime(dt2)) => dt1.cmp(&dt2.0.date_naive()),
(Timestamp::Date(dt1), Timestamp::Date(dt2)) => dt1.cmp(dt2),
}
}
@@ -105,11 +105,9 @@ pub trait Recordable {
#[derive(Clone, Debug, Eq, Hash, PartialEq, Deserialize, Serialize)]
pub struct UniqueId(Uuid);
-impl UniqueId {
- /// Create a new V4 UUID (this is the most common type in use these days).
- pub fn new() -> UniqueId {
- let id = Uuid::new_v4();
- UniqueId(id)
+impl Default for UniqueId {
+ fn default() -> Self {
+ Self(Uuid::new_v4())
}
}
@@ -120,14 +118,14 @@ impl str::FromStr for UniqueId {
fn from_str(val: &str) -> Result {
Uuid::parse_str(val)
.map(UniqueId)
- .map_err(|err| EmseriesReadError::UUIDParseError(err))
+ .map_err(EmseriesReadError::UUIDParseError)
}
}
impl fmt::Display for UniqueId {
/// Convert to a hyphenated string
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {
- write!(f, "{}", self.0.to_hyphenated().to_string())
+ write!(f, "{}", self.0.to_hyphenated())
}
}
@@ -146,7 +144,7 @@ where
type Err = EmseriesReadError;
fn from_str(line: &str) -> Result {
- serde_json::from_str(&line).map_err(|err| EmseriesReadError::JSONParseError(err))
+ serde_json::from_str(line).map_err(EmseriesReadError::JSONParseError)
}
}
@@ -184,7 +182,9 @@ mod test {
fn timestamp_parses_datetimetz_without_timezone() {
assert_eq!(
"2003-11-10T06:00:00Z".parse::().unwrap(),
- Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 10).and_hms(6, 0, 0))),
+ Timestamp::DateTime(DateTimeTz(
+ UTC.with_ymd_and_hms(2003, 11, 10, 6, 0, 0).unwrap()
+ )),
);
}
@@ -210,7 +210,9 @@ mod test {
assert_eq!(
rec.data,
Some(WeightRecord {
- date: Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 10).and_hms(6, 0, 0))),
+ date: Timestamp::DateTime(DateTimeTz(
+ UTC.with_ymd_and_hms(2003, 11, 10, 6, 0, 0).unwrap()
+ )),
weight: Weight(77.79109 * KG),
})
);
@@ -219,7 +221,9 @@ mod test {
#[test]
fn serialization_output() {
let rec = WeightRecord {
- date: Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 10).and_hms(6, 0, 0))),
+ date: Timestamp::DateTime(DateTimeTz(
+ UTC.with_ymd_and_hms(2003, 11, 10, 6, 0, 0).unwrap(),
+ )),
weight: Weight(77.0 * KG),
};
assert_eq!(
@@ -228,7 +232,12 @@ mod test {
);
let rec2 = WeightRecord {
- date: Timestamp::DateTime(Central.ymd(2003, 11, 10).and_hms(0, 0, 0).into()),
+ date: Timestamp::DateTime(
+ Central
+ .with_ymd_and_hms(2003, 11, 10, 0, 0, 0)
+ .unwrap()
+ .into(),
+ ),
weight: Weight(77.0 * KG),
};
assert_eq!(
@@ -239,22 +248,28 @@ mod test {
#[test]
fn two_datetimes_can_be_compared() {
- let time1 = Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 10).and_hms(6, 0, 0)));
- let time2 = Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 11).and_hms(6, 0, 0)));
+ let time1 = Timestamp::DateTime(DateTimeTz(
+ UTC.with_ymd_and_hms(2003, 11, 10, 6, 0, 0).unwrap(),
+ ));
+ let time2 = Timestamp::DateTime(DateTimeTz(
+ UTC.with_ymd_and_hms(2003, 11, 11, 6, 0, 0).unwrap(),
+ ));
assert!(time1 < time2);
}
#[test]
fn two_dates_can_be_compared() {
- let time1 = Timestamp::Date(NaiveDate::from_ymd(2003, 11, 10));
- let time2 = Timestamp::Date(NaiveDate::from_ymd(2003, 11, 11));
+ let time1 = Timestamp::Date(NaiveDate::from_ymd_opt(2003, 11, 10).unwrap());
+ let time2 = Timestamp::Date(NaiveDate::from_ymd_opt(2003, 11, 11).unwrap());
assert!(time1 < time2);
}
#[test]
fn datetime_and_date_can_be_compared() {
- let time1 = Timestamp::DateTime(DateTimeTz(UTC.ymd(2003, 11, 10).and_hms(6, 0, 0)));
- let time2 = Timestamp::Date(NaiveDate::from_ymd(2003, 11, 11));
+ let time1 = Timestamp::DateTime(DateTimeTz(
+ UTC.with_ymd_and_hms(2003, 11, 10, 6, 0, 0).unwrap(),
+ ));
+ let time2 = Timestamp::Date(NaiveDate::from_ymd_opt(2003, 11, 11).unwrap());
assert!(time1 < time2)
}
}
diff --git a/emseries/tests/test_io.rs b/emseries/tests/test_io.rs
index 92b1a8b..c599369 100644
--- a/emseries/tests/test_io.rs
+++ b/emseries/tests/test_io.rs
@@ -22,7 +22,7 @@ extern crate emseries;
mod test {
use chrono::prelude::*;
use chrono_tz::Etc::UTC;
- use dimensioned::si::{Kilogram, Meter, Second, KG, M, S};
+ use dimensioned::si::{Kilogram, Meter, Second, M, S};
use emseries::*;
@@ -52,31 +52,31 @@ mod test {
fn mk_trips() -> [BikeTrip; 5] {
[
BikeTrip {
- datetime: DateTimeTz(UTC.ymd(2011, 10, 29).and_hms(0, 0, 0)),
+ datetime: DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 29, 0, 0, 0).unwrap()),
distance: Distance(58741.055 * M),
duration: Duration(11040.0 * S),
comments: String::from("long time ago"),
},
BikeTrip {
- datetime: DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)),
+ datetime: DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()),
distance: Distance(17702.0 * M),
duration: Duration(2880.0 * S),
comments: String::from("day 2"),
},
BikeTrip {
- datetime: DateTimeTz(UTC.ymd(2011, 11, 02).and_hms(0, 0, 0)),
+ datetime: DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 02, 0, 0, 0).unwrap()),
distance: Distance(41842.945 * M),
duration: Duration(7020.0 * S),
comments: String::from("Do Some Distance!"),
},
BikeTrip {
- datetime: DateTimeTz(UTC.ymd(2011, 11, 04).and_hms(0, 0, 0)),
+ datetime: DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 04, 0, 0, 0).unwrap()),
distance: Distance(34600.895 * M),
duration: Duration(5580.0 * S),
comments: String::from("I did a lot of distance back then"),
},
BikeTrip {
- datetime: DateTimeTz(UTC.ymd(2011, 11, 05).and_hms(0, 0, 0)),
+ datetime: DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 05, 0, 0, 0).unwrap()),
distance: Distance(6437.376 * M),
duration: Duration(960.0 * S),
comments: String::from("day 5"),
@@ -122,7 +122,7 @@ mod test {
Some(tr) => {
assert_eq!(
tr.timestamp(),
- DateTimeTz(UTC.ymd(2011, 10, 29).and_hms(0, 0, 0)).into()
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 29, 0, 0, 0).unwrap()).into()
);
assert_eq!(tr.duration, Duration(11040.0 * S));
assert_eq!(tr.comments, String::from("long time ago"));
@@ -145,7 +145,7 @@ mod test {
let v: Vec<(&UniqueId, &BikeTrip)> = ts
.search(exact_time(
- DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)).into(),
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()).into(),
))
.collect();
assert_eq!(v.len(), 1);
@@ -166,9 +166,9 @@ mod test {
let v: Vec<(&UniqueId, &BikeTrip)> = ts.search_sorted(
time_range(
- DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)).into(),
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()).into(),
true,
- DateTimeTz(UTC.ymd(2011, 11, 04).and_hms(0, 0, 0)).into(),
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 04, 0, 0, 0).unwrap()).into(),
true,
),
|l, r| l.1.timestamp().cmp(&r.1.timestamp()),
@@ -199,9 +199,9 @@ mod test {
.expect("expect the time series to open correctly");
let v: Vec<(&UniqueId, &BikeTrip)> = ts.search_sorted(
time_range(
- DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)).into(),
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()).into(),
true,
- DateTimeTz(UTC.ymd(2011, 11, 04).and_hms(0, 0, 0)).into(),
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 04, 0, 0, 0).unwrap()).into(),
true,
),
|l, r| l.1.timestamp().cmp(&r.1.timestamp()),
@@ -233,9 +233,9 @@ mod test {
.expect("expect the time series to open correctly");
let v: Vec<(&UniqueId, &BikeTrip)> = ts.search_sorted(
time_range(
- DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)).into(),
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()).into(),
true,
- DateTimeTz(UTC.ymd(2011, 11, 04).and_hms(0, 0, 0)).into(),
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 04, 0, 0, 0).unwrap()).into(),
true,
),
|l, r| l.1.timestamp().cmp(&r.1.timestamp()),
@@ -252,9 +252,9 @@ mod test {
.expect("expect the time series to open correctly");
let v: Vec<(&UniqueId, &BikeTrip)> = ts.search_sorted(
time_range(
- DateTimeTz(UTC.ymd(2011, 10, 31).and_hms(0, 0, 0)).into(),
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 10, 31, 0, 0, 0).unwrap()).into(),
true,
- DateTimeTz(UTC.ymd(2011, 11, 05).and_hms(0, 0, 0)).into(),
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 05, 0, 0, 0).unwrap()).into(),
true,
),
|l, r| l.1.timestamp().cmp(&r.1.timestamp()),
@@ -294,7 +294,7 @@ mod test {
Some(trip) => {
assert_eq!(
trip.datetime,
- DateTimeTz(UTC.ymd(2011, 11, 02).and_hms(0, 0, 0))
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 02, 0, 0, 0).unwrap())
);
assert_eq!(trip.distance, Distance(50000.0 * M));
assert_eq!(trip.duration, Duration(7020.0 * S));
@@ -335,13 +335,13 @@ mod test {
let trips: Vec<(&UniqueId, &BikeTrip)> = ts
.search(exact_time(
- DateTimeTz(UTC.ymd(2011, 11, 02).and_hms(0, 0, 0)).into(),
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 02, 0, 0, 0).unwrap()).into(),
))
.collect();
assert_eq!(trips.len(), 1);
assert_eq!(
trips[0].1.datetime,
- DateTimeTz(UTC.ymd(2011, 11, 02).and_hms(0, 0, 0))
+ DateTimeTz(UTC.with_ymd_and_hms(2011, 11, 02, 0, 0, 0).unwrap())
);
assert_eq!(trips[0].1.distance, Distance(50000.0 * M));
assert_eq!(trips[0].1.duration, Duration(7020.0 * S));
@@ -361,7 +361,6 @@ mod test {
let trip_id = ts.put(trips[0].clone()).expect("expect a successful put");
ts.put(trips[1].clone()).expect("expect a successful put");
ts.put(trips[2].clone()).expect("expect a successful put");
-
ts.delete(&trip_id).expect("successful delete");
let recs: Vec<(&UniqueId, &BikeTrip)> = ts.records().collect();