use super::*;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum LeadershipMode {
#[default]
Disabled,
Preferred,
Required,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LeadershipRequirement {
service_id: ServiceId,
mode: LeadershipMode,
lease_duration_ms: u64,
}
impl LeadershipRequirement {
pub fn new(
service_id: ServiceId,
mode: LeadershipMode,
lease_duration_ms: u64,
) -> ContractResult<Self> {
if mode != LeadershipMode::Disabled && lease_duration_ms == 0 {
return Err(ContractError::InvalidValue {
field: "leadership.lease_duration_ms",
reason: "must be greater than zero when leadership is enabled",
});
}
Ok(Self {
service_id,
mode,
lease_duration_ms,
})
}
pub fn service_id(&self) -> &ServiceId {
&self.service_id
}
pub fn mode(&self) -> LeadershipMode {
self.mode
}
pub fn lease_duration_ms(&self) -> u64 {
self.lease_duration_ms
}
pub(crate) fn validate(&self) -> ContractResult<()> {
if self.mode != LeadershipMode::Disabled && self.lease_duration_ms == 0 {
return Err(ContractError::InvalidValue {
field: "leadership.lease_duration_ms",
reason: "must be greater than zero when leadership is enabled",
});
}
Ok(())
}
}