Skip to main content

appcore_contracts/policy/
leadership.rs

1// =============================================================================
2//        #######
3//     ###       ###     F: leadership.rs
4//    ##   ## ##   ##    P: AppCore-Runtime
5//         ## ##
6//                       C: 2026/07/22 15:41:18 by dnettoRaw
7//    ##   ## ##   ##    U: 2026/07/22 15:41:18 by dnettoRaw
8//      ###########      S: 1.0.1-rc.8
9// =============================================================================
10
11use super::*;
12
13/// Leadership behavior for one service.
14#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
15#[serde(rename_all = "snake_case")]
16pub enum LeadershipMode {
17    /// The service never participates in leader election.
18    #[default]
19    Disabled,
20    /// Leadership is useful but not required for all work.
21    Preferred,
22    /// Work is accepted only while this core holds the service lease.
23    Required,
24}
25
26/// Service-scoped leadership requirement.
27#[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    /// Creates a service-scoped leadership requirement.
36    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    /// Returns the independently coordinated service.
55    pub fn service_id(&self) -> &ServiceId {
56        &self.service_id
57    }
58
59    /// Returns the leadership mode.
60    pub fn mode(&self) -> LeadershipMode {
61        self.mode
62    }
63
64    /// Returns the requested lease duration in milliseconds.
65    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}