canic-core 0.110.33

Canic — a canister orchestration and management toolkit for the Internet Computer
Documentation
use crate::dto::prelude::*;

pub use crate::cdk::types::{BC, Cycles, CyclesConversionError, CyclesParseError, KC, MC, QC, TC};
pub use crate::domain::cycles::{CycleTopupEventStatus, CycleTopupFailureDisposition};

//
// CycleTrackerEntry
//

#[derive(CandidType, Deserialize)]
pub struct CycleTrackerEntry {
    pub timestamp_secs: u64,
    pub cycles: Cycles,
}

//
// CycleTopupEvent
//

#[derive(CandidType, Deserialize)]
pub struct CycleTopupEvent {
    pub timestamp_secs: u64,
    pub sequence: u32,
    pub requested_cycles: Cycles,
    pub transferred_cycles: Option<Cycles>,
    pub status: CycleTopupEventStatus,
    pub error: Option<String>,
    pub parent_failure: Option<CycleTopupFailure>,
}

/// Exact parent funding failure; its containing event supplies the failure time.
#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct CycleTopupFailure {
    pub parent: Principal,
    pub operation_id: [u8; 32],
    pub public_error_code: u16,
    pub disposition: CycleTopupFailureDisposition,
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn reexported_topup_status_roundtrips_through_candid() {
        let event = CycleTopupEvent {
            timestamp_secs: 42,
            sequence: 7,
            requested_cycles: Cycles::new(1_000_000),
            transferred_cycles: Some(Cycles::new(999_000)),
            status: crate::domain::cycles::CycleTopupEventStatus::RequestOk,
            error: None,
            parent_failure: None,
        };

        let bytes = candid::encode_one(&event).expect("encode cycle top-up event");
        let decoded: CycleTopupEvent =
            candid::decode_one(&bytes).expect("decode cycle top-up event");

        let dto_status: CycleTopupEventStatus =
            crate::domain::cycles::CycleTopupEventStatus::RequestOk;

        assert_eq!(decoded.timestamp_secs, 42);
        assert_eq!(decoded.sequence, 7);
        assert_eq!(decoded.requested_cycles, Cycles::new(1_000_000));
        assert_eq!(decoded.transferred_cycles, Some(Cycles::new(999_000)));
        assert_eq!(decoded.status, dto_status);
        assert_eq!(decoded.error, None);
    }
}