1pub use crate::perf::PerfEntry;
2
3use crate::{cdk::candid::CandidType, perf, types::PageRequest};
4use serde::{Deserialize, Serialize};
5
6#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
12pub struct PerfSnapshot {
13 pub entries: Vec<PerfEntry>,
14 pub total: u64,
15}
16
17pub struct PerfOps;
22
23impl PerfOps {
24 pub(crate) fn record(label: &str, delta: u64) {
25 perf::record(label, delta);
26 }
27
28 #[must_use]
29 pub fn snapshot(request: PageRequest) -> PerfSnapshot {
30 let request = request.clamped();
31 let offset = usize::try_from(request.offset).unwrap_or(usize::MAX);
32 let limit = usize::try_from(request.limit).unwrap_or(usize::MAX);
33
34 let entries = perf::entries();
35 let total = entries.len() as u64;
36 let entries = entries.into_iter().skip(offset).take(limit).collect();
37
38 PerfSnapshot { entries, total }
39 }
40}