use cosmwasm_std::{Addr, Api, StdResult};
#[cosmwasm_schema::cw_serde]
pub enum Clearable<C> {
Clear,
Set(C),
}
impl<C> Clearable<C> {
pub fn new(value: C) -> Clearable<C> {
Clearable::Set(value)
}
pub fn new_opt(value: C) -> Option<Clearable<C>> {
Some(Clearable::Set(value))
}
}
impl Clearable<String> {
pub fn check(&self, api: &dyn Api) -> StdResult<Clearable<Addr>> {
match self {
Clearable::Clear => Ok(Clearable::Clear),
Clearable::Set(human) => Ok(Clearable::Set(api.addr_validate(human)?)),
}
}
}
impl<C> Into<Option<C>> for Clearable<C> {
fn into(self) -> Option<C> {
match self {
Clearable::Clear => None,
Clearable::Set(val) => Some(val),
}
}
}
#[cfg(test)]
mod test {
use super::*;
use cosmwasm_std::testing::MockStorage;
use cw_storage_plus::Item;
const FOO: Item<Option<u32>> = Item::new("foo");
#[test]
fn clear() {
let mut storage = MockStorage::new();
FOO.save(&mut storage, &Some(0u32)).unwrap();
let clearable: Clearable<u32> = Clearable::Clear;
FOO.save(&mut storage, &clearable.into()).unwrap();
let foo = FOO.load(&storage).unwrap();
assert_eq!(foo, None);
}
#[test]
fn set() {
let mut storage = MockStorage::new();
FOO.save(&mut storage, &Some(0u32)).unwrap();
let clearable: Clearable<u32> = Clearable::Set(42);
FOO.save(&mut storage, &clearable.into()).unwrap();
let foo = FOO.load(&storage).unwrap();
assert_eq!(foo, Some(42));
}
#[test]
fn constructors() {
let clearable_new = Clearable::new(5u32);
assert_eq!(clearable_new, Clearable::Set(5u32));
let clearable_new_opt = Clearable::new_opt(6u32);
assert_eq!(clearable_new_opt, Some(Clearable::Set(6u32)))
}
}