tendermint_testgen/
time.rs1use gumdrop::Options;
2use serde::Deserialize;
3use simple_error::*;
4
5use crate::{helpers::*, Generator};
6
7#[derive(Debug, Options, Deserialize, Clone)]
8pub struct Time {
9 #[options(help = "seconds passed since UNIX EPOCH (required; can be passed via STDIN)")]
10 pub secs: Option<u64>,
11}
12
13impl Time {
14 pub fn new(secs: u64) -> Self {
15 Time { secs: Some(secs) }
16 }
17 set_option!(secs, u64);
18}
19
20impl std::str::FromStr for Time {
21 type Err = SimpleError;
22 fn from_str(s: &str) -> Result<Self, Self::Err> {
23 let time = match parse_as::<Time>(s) {
24 Ok(input) => input,
25 Err(_) => Time::new(try_with!(u64::from_str(s), "failed to parse time")),
26 };
27 Ok(time)
28 }
29}
30
31impl Generator<tendermint::Time> for Time {
32 fn merge_with_default(self, default: Self) -> Self {
33 Time {
34 secs: self.secs.or(default.secs),
35 }
36 }
37
38 fn generate(&self) -> Result<tendermint::Time, SimpleError> {
39 let time = match &self.secs {
40 None => bail!("time is missing"),
41 Some(secs) => *secs,
42 };
43 get_time(time)
44 }
45}
46
47#[cfg(test)]
48mod tests {
49 use super::*;
50
51 #[test]
52 fn test_time() {
53 let time = Time::new(0);
54 assert_eq!(time.generate().unwrap(), tendermint::Time::unix_epoch());
55 }
56}