Skip to main content

canic_core/dto/
state.rs

1use crate::dto::prelude::*;
2
3pub use crate::domain::state::{FleetMode, FleetStatus};
4
5/// Explicit input for changing automatic cycles funding.
6#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
7pub struct SetCyclesFundingRequest {
8    pub enabled: bool,
9}
10
11/// Explicit input for changing the Fleet's public status.
12#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
13pub struct SetFleetStatusRequest {
14    pub status: FleetStatus,
15}
16
17//
18// FleetCommand
19//
20
21#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
22pub enum FleetCommand {
23    SetStatus(FleetStatus),
24    SetCyclesFundingEnabled(bool),
25}
26
27//
28// FleetCommandResponse
29//
30
31#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
32pub enum FleetCommandResponse {
33    Status(SetStateResponse<FleetStatus>),
34    CyclesFundingEnabled(SetStateResponse<bool>),
35}
36
37//
38// SetStateResponse
39//
40
41#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
42pub struct SetStateResponse<T> {
43    pub previous: T,
44    pub current: T,
45    pub changed: bool,
46}
47
48/// Local mutation receipt and the independently observed downstream results.
49#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
50pub struct FleetStateCommandResult<T> {
51    pub change: SetStateResponse<T>,
52    pub propagation: crate::dto::cascade::StateCascadeReport,
53    pub reconciliation_error: Option<crate::dto::error::Error>,
54}
55
56/// Workflow result before the endpoint selects its command-specific response.
57#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
58pub struct FleetCommandExecutionResponse {
59    pub change: FleetCommandResponse,
60    pub propagation: crate::dto::cascade::StateCascadeReport,
61    pub reconciliation_error: Option<crate::dto::error::Error>,
62}
63
64//
65// FleetStateInput
66//
67
68#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq)]
69pub struct FleetStateInput {
70    pub mode: FleetMode,
71    pub cycles_funding_enabled: bool,
72}
73
74//
75// FleetStateResponse
76//
77
78#[derive(CandidType, Deserialize)]
79pub struct FleetStateResponse {
80    pub mode: FleetMode,
81    pub cycles_funding_enabled: bool,
82}
83
84//
85// BootstrapStatusResponse
86//
87
88#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
89pub struct BootstrapStatusResponse {
90    pub ready: bool,
91    pub phase: String,
92    pub last_error: Option<String>,
93}
94
95#[cfg(test)]
96mod tests {
97    use super::*;
98    use candid::{Decode, Encode};
99    use serde::de::DeserializeOwned;
100    use std::fmt::Debug;
101
102    #[test]
103    fn fleet_mode_roundtrips_candid_through_dto_path() {
104        assert_enum_candid_contract(FleetMode::Readonly);
105    }
106
107    #[test]
108    fn fleet_status_roundtrips_candid_through_dto_path() {
109        assert_enum_candid_contract(FleetStatus::Readonly);
110    }
111
112    fn assert_enum_candid_contract<T>(value: T)
113    where
114        T: CandidType + Clone + Debug + DeserializeOwned + Eq,
115    {
116        let bytes = Encode!(&value).expect("encode state enum");
117        let decoded = Decode!(&bytes, T).expect("decode state enum");
118
119        assert_eq!(decoded, value);
120    }
121}