ve3-shared 0.9.1

ve(3,3) msgs in cosmwasm
Documentation
use crate::helpers::governance::get_period;
use cosmwasm_schema::cw_serde;
use cosmwasm_std::{Env, StdResult};

#[cw_serde]
#[derive(Default)]
pub enum Time {
  #[default]
  Current,
  Next,
  Last,
  Time(u64),
  Period(u64),
}

pub trait GetPeriod {
  fn get_period(self, env: &Env) -> StdResult<u64>;
}
impl GetPeriod for Option<Time> {
  fn get_period(self, env: &Env) -> StdResult<u64> {
    match self {
      Some(time) => time.get_period(env),
      None => get_period(env.block.time.seconds()),
    }
  }
}

impl GetPeriod for Time {
  fn get_period(self, env: &Env) -> StdResult<u64> {
    match self {
      Time::Current => get_period(env.block.time.seconds()),
      Time::Next => Ok(get_period(env.block.time.seconds())? + 1),
      Time::Last => Ok(get_period(env.block.time.seconds())? - 1),
      Time::Time(time) => get_period(time),
      Time::Period(period) => Ok(period),
    }
  }
}

#[cw_serde]
#[derive(Default)]
pub enum Times {
  #[default]
  Current,
  Times(Vec<u64>),
  Periods(Vec<u64>),
}

pub trait GetPeriods {
  fn get_periods(self, env: &Env) -> StdResult<Vec<u64>>;
}
impl GetPeriods for Option<Times> {
  fn get_periods(self, env: &Env) -> StdResult<Vec<u64>> {
    match self {
      Some(time) => match time {
        Times::Current => Ok(vec![get_period(env.block.time.seconds())?]),
        Times::Times(time) => time.into_iter().map(get_period).collect::<StdResult<Vec<_>>>(),
        Times::Periods(periods) => Ok(periods),
      },
      None => Ok(vec![get_period(env.block.time.seconds())?]),
    }
  }
}