De-'float'-ing Interval (Display impl + serde) (#1065)

* Updated time to 0.3.6

* Changed Display impl for Interval so it doesnt use floats

* Explicit rfc3339 datetime serialization

* Typo

* Changed 'visit_borrwed_str' to 'visit_str'
This commit is contained in:
Jędrzej Stuczyński
2022-01-25 11:17:44 +00:00
committed by GitHub
parent a03cb1ef9f
commit 655ff9bffb
5 changed files with 125 additions and 38 deletions
Generated
+35 -19
View File
@@ -1223,7 +1223,7 @@ checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a"
dependencies = [
"cssparser-macros",
"dtoa-short",
"itoa",
"itoa 0.4.8",
"matches",
"phf 0.8.0",
"proc-macro2",
@@ -1250,7 +1250,7 @@ checksum = "22813a6dc45b335f9bade10bf7271dc477e81113e89eb251a0bc2a8a81c536e1"
dependencies = [
"bstr",
"csv-core",
"itoa",
"itoa 0.4.8",
"ryu",
"serde",
]
@@ -2809,7 +2809,7 @@ checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b"
dependencies = [
"bytes",
"fnv",
"itoa",
"itoa 0.4.8",
]
[[package]]
@@ -2881,7 +2881,7 @@ dependencies = [
"http-body",
"httparse",
"httpdate",
"itoa",
"itoa 0.4.8",
"pin-project-lite",
"socket2",
"tokio",
@@ -3149,6 +3149,12 @@ version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4"
[[package]]
name = "itoa"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
[[package]]
name = "javascriptcore-rs"
version = "0.14.0"
@@ -3271,9 +3277,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
version = "0.2.102"
version = "0.2.113"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103"
checksum = "eef78b64d87775463c549fbd80e19249ef436ea3bf1de2a1eb7e717ec7fab1e9"
[[package]]
name = "libgit2-sys"
@@ -3499,7 +3505,7 @@ dependencies = [
"serde",
"serde_repr",
"thiserror",
"time 0.3.5",
"time 0.3.6",
"ts-rs",
]
@@ -3626,7 +3632,7 @@ dependencies = [
"cfg-if 1.0.0",
"hex-literal",
"serde",
"time 0.3.5",
"time 0.3.6",
"url",
]
@@ -3757,6 +3763,15 @@ dependencies = [
"syn",
]
[[package]]
name = "num_threads"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71a1eb3a36534514077c1e079ada2fb170ef30c47d203aa6916138cf882ecd52"
dependencies = [
"libc",
]
[[package]]
name = "nym-client"
version = "0.12.1"
@@ -3958,7 +3973,7 @@ dependencies = [
"serde_json",
"sqlx",
"thiserror",
"time 0.3.5",
"time 0.3.6",
"tokio",
"topology",
"url",
@@ -5810,7 +5825,7 @@ version = "1.0.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8"
dependencies = [
"itoa",
"itoa 0.4.8",
"ryu",
"serde",
]
@@ -5833,7 +5848,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97"
dependencies = [
"dtoa",
"itoa",
"itoa 0.4.8",
"serde",
"url",
]
@@ -5845,7 +5860,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9"
dependencies = [
"form_urlencoded",
"itoa",
"itoa 0.4.8",
"ryu",
"serde",
]
@@ -6175,7 +6190,7 @@ dependencies = [
"futures-util",
"hashlink",
"hex",
"itoa",
"itoa 0.4.8",
"libc",
"libsqlite3-sys",
"log",
@@ -6870,7 +6885,7 @@ dependencies = [
"subtle 2.4.1",
"subtle-encoding",
"tendermint-proto",
"time 0.3.5",
"time 0.3.6",
"zeroize",
]
@@ -6903,7 +6918,7 @@ dependencies = [
"serde",
"serde_bytes",
"subtle-encoding",
"time 0.3.5",
"time 0.3.6",
]
[[package]]
@@ -6931,7 +6946,7 @@ dependencies = [
"tendermint-config",
"tendermint-proto",
"thiserror",
"time 0.3.5",
"time 0.3.6",
"tokio",
"tracing",
"url",
@@ -7031,12 +7046,13 @@ dependencies = [
[[package]]
name = "time"
version = "0.3.5"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad"
checksum = "c8d54b9298e05179c335de2b9645d061255bcd5155f843b3e328d2cfe0a5b413"
dependencies = [
"itoa",
"itoa 1.0.1",
"libc",
"num_threads",
"serde",
"time-macros 0.2.3",
]
@@ -18,7 +18,7 @@ network-defaults = { path = "../../network-defaults" }
fixed = { version = "1.1", features = ["serde"] }
az = "1.1"
log = "0.4.14"
time = { version = "0.3.5", features = ["serde"] }
time = { version = "0.3.6", features = ["parsing", "formatting"] }
contracts-common = { path = "../contracts-common" }
@@ -8,10 +8,59 @@ use std::fmt::{Display, Formatter};
use std::time::Duration;
use time::OffsetDateTime;
// internally, since version 0.3.6, time uses deserialize_any for deserialization, which can't be handled
// by serde wasm. We could just downgrade to 0.3.5 and call it a day, but then it would break
// when we decided to upgrade it at some point in the future. And then it would have been more problematic
// to fix it, since the data would have already been stored inside the contract.
// Hence, an explicit workaround to use string representation of Rfc3339-formatted datetime.
pub(crate) mod string_rfc3339_offset_date_time {
use serde::de::Visitor;
use serde::ser::Error;
use serde::{Deserializer, Serialize, Serializer};
use std::fmt::Formatter;
use time::format_description::well_known::Rfc3339;
use time::OffsetDateTime;
struct Rfc3339OffsetDateTimeVisitor;
impl<'de> Visitor<'de> for Rfc3339OffsetDateTimeVisitor {
type Value = OffsetDateTime;
fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
formatter.write_str("an rfc3339 `OffsetDateTime`")
}
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
where
E: serde::de::Error,
{
OffsetDateTime::parse(value, &Rfc3339).map_err(E::custom)
}
}
pub(crate) fn deserialize<'de, D>(deserializer: D) -> Result<OffsetDateTime, D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_str(Rfc3339OffsetDateTimeVisitor)
}
pub(crate) fn serialize<S>(datetime: &OffsetDateTime, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
datetime
.format(&Rfc3339)
.map_err(S::Error::custom)?
.serialize(serializer)
}
}
/// Representation of rewarding interval.
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, PartialOrd, Serialize)]
pub struct Interval {
id: u32,
#[serde(with = "string_rfc3339_offset_date_time")]
start: OffsetDateTime,
length: Duration,
}
@@ -171,15 +220,17 @@ impl Interval {
impl Display for Interval {
fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
let length = self.length();
let hours = length.as_secs_f32() / 3600.0;
let length = self.length().as_secs();
let full_hours = length / 3600;
let rem = length % 3600;
write!(
f,
"Interval {}: {} - {} ({:.1} hours)",
"Interval {}: {} - {} ({}h {}s)",
self.id,
self.start(),
self.end(),
hours
full_hours,
rem
)
}
}
+16 -6
View File
@@ -853,7 +853,7 @@ dependencies = [
"schemars",
"serde",
"thiserror",
"time 0.3.5",
"time 0.3.6",
"vergen",
"vesting-contract",
]
@@ -872,7 +872,7 @@ dependencies = [
"serde",
"serde_repr",
"thiserror",
"time 0.3.5",
"time 0.3.6",
]
[[package]]
@@ -882,7 +882,7 @@ dependencies = [
"cfg-if",
"hex-literal",
"serde",
"time 0.3.5",
"time 0.3.6",
"url",
]
@@ -906,6 +906,15 @@ dependencies = [
"libm",
]
[[package]]
name = "num_threads"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71a1eb3a36534514077c1e079ada2fb170ef30c47d203aa6916138cf882ecd52"
dependencies = [
"libc",
]
[[package]]
name = "nymsphinx-types"
version = "0.1.0"
@@ -1405,12 +1414,13 @@ dependencies = [
[[package]]
name = "time"
version = "0.3.5"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad"
checksum = "c8d54b9298e05179c335de2b9645d061255bcd5155f843b3e328d2cfe0a5b413"
dependencies = [
"itoa",
"libc",
"serde",
"num_threads",
"time-macros",
]
+18 -8
View File
@@ -2609,7 +2609,7 @@ dependencies = [
"serde",
"serde_repr",
"thiserror",
"time 0.3.5",
"time 0.3.6",
"ts-rs",
]
@@ -2684,7 +2684,7 @@ dependencies = [
"cfg-if 1.0.0",
"hex-literal",
"serde",
"time 0.3.5",
"time 0.3.6",
"url",
]
@@ -2795,6 +2795,15 @@ dependencies = [
"syn",
]
[[package]]
name = "num_threads"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71a1eb3a36534514077c1e079ada2fb170ef30c47d203aa6916138cf882ecd52"
dependencies = [
"libc",
]
[[package]]
name = "nym_wallet"
version = "0.1.0"
@@ -4896,7 +4905,7 @@ dependencies = [
"subtle 2.4.1",
"subtle-encoding",
"tendermint-proto",
"time 0.3.5",
"time 0.3.6",
"zeroize",
]
@@ -4929,7 +4938,7 @@ dependencies = [
"serde",
"serde_bytes",
"subtle-encoding",
"time 0.3.5",
"time 0.3.6",
]
[[package]]
@@ -4957,7 +4966,7 @@ dependencies = [
"tendermint-config",
"tendermint-proto",
"thiserror",
"time 0.3.5",
"time 0.3.6",
"tokio",
"tracing",
"url",
@@ -5023,12 +5032,13 @@ dependencies = [
[[package]]
name = "time"
version = "0.3.5"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad"
checksum = "c8d54b9298e05179c335de2b9645d061255bcd5155f843b3e328d2cfe0a5b413"
dependencies = [
"itoa 1.0.1",
"libc",
"serde",
"num_threads",
"time-macros",
]