use eosio_bytes::*;
use serde::Serialize;
use std::convert::{TryFrom, TryInto};
#[derive(
Read,
Write,
NumBytes,
PartialEq,
Eq,
PartialOrd,
Ord,
Debug,
Clone,
Copy,
Hash,
Default,
Serialize,
)]
#[eosio_bytes_root_path = "::eosio_bytes"]
pub struct TimePoint(i64);
impl TimePoint {
#[inline]
pub const fn as_i64(self) -> i64 {
self.0
}
}
struct TimePointVisitor;
impl<'de> ::serde::de::Visitor<'de> for TimePointVisitor {
type Value = TimePoint;
#[inline]
fn expecting(
&self,
formatter: &mut ::std::fmt::Formatter,
) -> ::std::fmt::Result {
formatter.write_str("a microsecond timestamp as a number or string")
}
#[inline]
fn visit_str<E>(self, value: &str) -> Result<Self::Value, E>
where
E: ::serde::de::Error,
{
match value.parse::<i64>() {
Ok(n) => Ok(TimePoint(n)),
Err(e) => Err(::serde::de::Error::custom(e)),
}
}
#[inline]
fn visit_i64<E>(self, value: i64) -> Result<Self::Value, E>
where
E: ::serde::de::Error,
{
Ok(TimePoint(value))
}
}
impl<'de> ::serde::de::Deserialize<'de> for TimePoint {
#[inline]
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: ::serde::de::Deserializer<'de>,
{
deserializer.deserialize_any(TimePointVisitor)
}
}
impl From<i64> for TimePoint {
#[inline]
fn from(i: i64) -> Self {
Self(i)
}
}
impl From<TimePoint> for i64 {
#[inline]
fn from(t: TimePoint) -> Self {
t.0
}
}
impl TryFrom<u64> for TimePoint {
type Error = std::num::TryFromIntError;
#[inline]
fn try_from(i: u64) -> Result<Self, Self::Error> {
Ok(i64::try_from(i)?.into())
}
}
impl TryFrom<TimePoint> for u64 {
type Error = std::num::TryFromIntError;
#[inline]
fn try_from(t: TimePoint) -> Result<Self, Self::Error> {
t.as_i64().try_into()
}
}