appcore_contracts/policy/
leadership.rs1use super::*;
12
13#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
15#[serde(rename_all = "snake_case")]
16pub enum LeadershipMode {
17 #[default]
19 Disabled,
20 Preferred,
22 Required,
24}
25
26#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
28pub struct LeadershipRequirement {
29 service_id: ServiceId,
30 mode: LeadershipMode,
31 lease_duration_ms: u64,
32}
33
34impl LeadershipRequirement {
35 pub fn new(
37 service_id: ServiceId,
38 mode: LeadershipMode,
39 lease_duration_ms: u64,
40 ) -> ContractResult<Self> {
41 if mode != LeadershipMode::Disabled && lease_duration_ms == 0 {
42 return Err(ContractError::InvalidValue {
43 field: "leadership.lease_duration_ms",
44 reason: "must be greater than zero when leadership is enabled",
45 });
46 }
47 Ok(Self {
48 service_id,
49 mode,
50 lease_duration_ms,
51 })
52 }
53
54 pub fn service_id(&self) -> &ServiceId {
56 &self.service_id
57 }
58
59 pub fn mode(&self) -> LeadershipMode {
61 self.mode
62 }
63
64 pub fn lease_duration_ms(&self) -> u64 {
66 self.lease_duration_ms
67 }
68
69 pub(crate) fn validate(&self) -> ContractResult<()> {
70 if self.mode != LeadershipMode::Disabled && self.lease_duration_ms == 0 {
71 return Err(ContractError::InvalidValue {
72 field: "leadership.lease_duration_ms",
73 reason: "must be greater than zero when leadership is enabled",
74 });
75 }
76 Ok(())
77 }
78}