pylon_gateway/
time_range.rs

1use cosmwasm_std::*;
2use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4use std::fmt::{Display, Formatter};
5use std::ops::Sub;
6
7use crate::validator::Validator;
8
9#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, JsonSchema)]
10pub struct TimeRange {
11    pub start: u64,
12    pub finish: u64,
13    pub inverse: bool,
14}
15
16impl Default for TimeRange {
17    fn default() -> Self {
18        TimeRange {
19            start: 0,
20            finish: 0,
21            inverse: false,
22        }
23    }
24}
25
26impl Display for TimeRange {
27    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
28        if self.inverse {
29            if self.start != 0 && self.finish != 0 {
30                write!(f, "(~ {}, {} ~)", self.start, self.finish)
31            } else if self.start == 0 {
32                write!(f, "{} ~)", self.finish)
33            } else {
34                write!(f, "(~ {})", self.start)
35            }
36        }
37        /* not inverse */
38        else if self.start != 0 && self.finish != 0 {
39            write!(f, "({} ~ {})", self.start, self.finish)
40        } else if self.start == 0 {
41            write!(f, "(~ {})", self.finish)
42        } else {
43            write!(f, "({} ~)", self.start)
44        }
45    }
46}
47
48impl Validator for TimeRange {
49    fn validate(&self) -> StdResult<()> {
50        if (self.start != 0 && self.finish != 0) && self.start.gt(&self.finish) {
51            return Err(StdError::generic_err(
52                "Gateway/Pool: time range validation failed. reason: finish < start",
53            ));
54        }
55
56        Ok(())
57    }
58}
59
60impl TimeRange {
61    pub fn period(&self) -> u64 {
62        if self.inverse {
63            0
64        } else {
65            self.finish.sub(self.start)
66        }
67    }
68
69    pub fn is_in_range(&self, env: &Env) -> bool {
70        if self.inverse {
71            if self.start == 0 {
72                return self.finish < env.block.time.seconds();
73            }
74            if self.finish == 0 {
75                return env.block.time.seconds() < self.start;
76            }
77            env.block.time.seconds() < self.start || self.finish < env.block.time.seconds()
78        } else {
79            if self.start == 0 {
80                return env.block.time.seconds() < self.finish;
81            }
82            if self.finish == 0 {
83                return self.start < env.block.time.seconds();
84            }
85            self.start < env.block.time.seconds() && env.block.time.seconds() < self.finish
86        }
87    }
88
89    pub fn configure(&mut self, start: Option<u64>, finish: Option<u64>) -> Vec<Attribute> {
90        let mut attrs = vec![];
91        if let Some(start) = start {
92            self.start = start;
93            attrs.push(Attribute::new("new_start_time", start.to_string()));
94        }
95        if let Some(finish) = finish {
96            self.finish = finish;
97            attrs.push(Attribute::new("new_finish_time", finish.to_string()));
98        }
99        attrs
100    }
101}