pylon_gateway/
time_range.rs1use 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 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}