Skip to main content

canic_core/dto/
cycles.rs

1use crate::{cdk::types::Cycles, dto::prelude::*};
2
3pub use crate::domain::cycles::CycleTopupEventStatus;
4
5//
6// CycleTrackerEntry
7//
8
9#[derive(CandidType, Deserialize)]
10pub struct CycleTrackerEntry {
11    pub timestamp_secs: u64,
12    pub cycles: Cycles,
13}
14
15//
16// CycleTopupEvent
17//
18
19#[derive(CandidType, Deserialize)]
20pub struct CycleTopupEvent {
21    pub timestamp_secs: u64,
22    pub sequence: u32,
23    pub requested_cycles: Cycles,
24    pub transferred_cycles: Option<Cycles>,
25    pub status: CycleTopupEventStatus,
26    pub error: Option<String>,
27}
28
29#[cfg(test)]
30mod tests {
31    use super::*;
32
33    #[test]
34    fn reexported_topup_status_roundtrips_through_candid() {
35        let event = CycleTopupEvent {
36            timestamp_secs: 42,
37            sequence: 7,
38            requested_cycles: Cycles::new(1_000_000),
39            transferred_cycles: Some(Cycles::new(999_000)),
40            status: crate::domain::cycles::CycleTopupEventStatus::RequestOk,
41            error: None,
42        };
43
44        let bytes = candid::encode_one(&event).expect("encode cycle top-up event");
45        let decoded: CycleTopupEvent =
46            candid::decode_one(&bytes).expect("decode cycle top-up event");
47
48        let dto_status: CycleTopupEventStatus =
49            crate::domain::cycles::CycleTopupEventStatus::RequestOk;
50
51        assert_eq!(decoded.timestamp_secs, 42);
52        assert_eq!(decoded.sequence, 7);
53        assert_eq!(decoded.requested_cycles, Cycles::new(1_000_000));
54        assert_eq!(decoded.transferred_cycles, Some(Cycles::new(999_000)));
55        assert_eq!(decoded.status, dto_status);
56        assert_eq!(decoded.error, None);
57    }
58}