#![doc(html_root_url = "https://docs.rs/prost-types/0.6.1")]
use std::convert::TryFrom;
use std::i32;
use std::i64;
use std::time;
include!("protobuf.rs");
pub mod compiler {
include!("compiler.rs");
}
const NANOS_PER_SECOND: i32 = 1_000_000_000;
impl Duration {
fn normalize(&mut self) {
if self.nanos <= -NANOS_PER_SECOND || self.nanos >= NANOS_PER_SECOND {
self.seconds += (self.nanos / NANOS_PER_SECOND) as i64;
self.nanos %= NANOS_PER_SECOND;
}
if self.seconds < 0 && self.nanos > 0 {
self.seconds += 1;
self.nanos -= NANOS_PER_SECOND;
} else if self.seconds > 0 && self.nanos < 0 {
self.seconds -= 1;
self.nanos += NANOS_PER_SECOND;
}
}
}
impl From<time::Duration> for Duration {
fn from(duration: time::Duration) -> Duration {
let seconds = duration.as_secs();
let seconds = if seconds > i64::MAX as u64 {
i64::MAX
} else {
seconds as i64
};
let nanos = duration.subsec_nanos();
let nanos = if nanos > i32::MAX as u32 {
i32::MAX
} else {
nanos as i32
};
let mut duration = Duration { seconds, nanos };
duration.normalize();
duration
}
}
impl TryFrom<Duration> for time::Duration {
type Error = time::Duration;
fn try_from(mut duration: Duration) -> Result<time::Duration, time::Duration> {
duration.normalize();
if duration.seconds >= 0 {
Ok(time::Duration::new(
duration.seconds as u64,
duration.nanos as u32,
))
} else {
Err(time::Duration::new(
(-duration.seconds) as u64,
(-duration.nanos) as u32,
))
}
}
}
impl Timestamp {
fn normalize(&mut self) {
if self.nanos <= -NANOS_PER_SECOND || self.nanos >= NANOS_PER_SECOND {
self.seconds += (self.nanos / NANOS_PER_SECOND) as i64;
self.nanos %= NANOS_PER_SECOND;
}
if self.nanos < 0 {
self.seconds -= 1;
self.nanos += NANOS_PER_SECOND;
}
}
}
impl From<time::SystemTime> for Timestamp {
fn from(time: time::SystemTime) -> Timestamp {
let duration = Duration::from(time.duration_since(time::UNIX_EPOCH).unwrap());
Timestamp {
seconds: duration.seconds,
nanos: duration.nanos,
}
}
}
impl TryFrom<Timestamp> for time::SystemTime {
type Error = time::Duration;
fn try_from(mut timestamp: Timestamp) -> Result<time::SystemTime, time::Duration> {
timestamp.normalize();
if timestamp.seconds >= 0 {
Ok(time::UNIX_EPOCH
+ time::Duration::new(timestamp.seconds as u64, timestamp.nanos as u32))
} else {
let mut duration = Duration {
seconds: -timestamp.seconds,
nanos: timestamp.nanos,
};
duration.normalize();
Err(time::Duration::new(
duration.seconds as u64,
duration.nanos as u32,
))
}
}
}