#![doc(html_root_url = "https://docs.rs/prost-codegen/0.2.3")]
#[macro_use]
extern crate prost_derive;
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 From<Duration> for Result<time::Duration, time::Duration> {
fn 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 From<Timestamp> for Result<time::SystemTime, time::Duration> {
fn 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))
}
}
}