use derive_more::From;
use crate::{address::Address, Error};
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, From, packable::Packable)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ExpirationUnlockCondition {
return_address: Address,
#[packable(verify_with = verify_timestamp)]
timestamp: u32,
}
impl ExpirationUnlockCondition {
pub const KIND: u8 = 3;
#[inline(always)]
pub fn new(return_address: Address, timestamp: u32) -> Result<Self, Error> {
verify_timestamp::<true>(×tamp, &())?;
Ok(Self {
return_address,
timestamp,
})
}
#[inline(always)]
pub fn return_address(&self) -> &Address {
&self.return_address
}
#[inline(always)]
pub fn timestamp(&self) -> u32 {
self.timestamp
}
pub fn return_address_expired(&self, timestamp: u32) -> Option<&Address> {
if timestamp >= self.timestamp() {
Some(&self.return_address)
} else {
None
}
}
}
#[inline]
fn verify_timestamp<const VERIFY: bool>(timestamp: &u32, _: &()) -> Result<(), Error> {
if VERIFY && *timestamp == 0 {
Err(Error::ExpirationUnlockConditionZero)
} else {
Ok(())
}
}
#[cfg(feature = "dto")]
#[allow(missing_docs)]
pub mod dto {
use serde::{Deserialize, Serialize};
use crate::address::dto::AddressDto;
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct ExpirationUnlockConditionDto {
#[serde(rename = "type")]
pub kind: u8,
#[serde(rename = "returnAddress")]
pub return_address: AddressDto,
#[serde(rename = "unixTime")]
pub timestamp: u32,
}
}