Skip to main content

ic_query/ic/model/
reports.rs

1//! Module: ic::model::reports
2//!
3//! Responsibility: public serialized Dashboard report, row, and provenance contracts.
4//! Does not own: requests, host source data, errors, transport, or projection.
5//! Boundary: preserves raw Dashboard values and explicit off-chain provenance.
6
7use super::requests::{
8    IcCanisterFilters, IcDailyStatsQuery, IcIcrcIndexedCountKind, IcIcrcTokenValueQuery,
9    IcIcrcTotalSupplyQuery, IcMetricQuery, IcNodeProviderRewardHistoryQuery,
10    IcNodeProviderRewardListQuery, IcReplicaVersionListQuery,
11};
12use serde::Serialize;
13use std::{collections::BTreeMap, fmt};
14
15///
16/// IcCanisterUpgrade
17///
18/// One proposal-linked canister upgrade recorded by the Dashboard API.
19///
20
21#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
22pub struct IcCanisterUpgrade {
23    /// Proposal execution time as raw Unix seconds.
24    pub executed_timestamp_seconds: u64,
25    /// Wasm module hash as raw lowercase hexadecimal text.
26    pub module_hash: String,
27    /// NNS proposal that installed this module.
28    pub proposal_id: u64,
29}
30
31///
32/// IcDashboardReportProvenance
33///
34/// Shared off-chain provenance and authority guarantees for Dashboard reports.
35///
36
37#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
38pub struct IcDashboardReportProvenance {
39    /// Report schema version.
40    pub schema_version: u32,
41    /// Network represented by the official Dashboard API.
42    pub network: String,
43    /// Authority that supplied the report fields.
44    pub authority: String,
45    /// Dashboard API base endpoint queried by the source.
46    pub source_endpoint: String,
47    /// Time this report was collected.
48    pub fetched_at: String,
49    /// Collector identity.
50    pub fetched_by: String,
51    /// Whether the API response is cryptographically certified IC state.
52    pub certified: bool,
53    /// Whether every returned value is guaranteed to describe one point in time.
54    pub point_in_time_guaranteed: bool,
55}
56
57///
58/// IcMetricObservation
59///
60/// One raw timestamp and value returned by the Dashboard Metrics API.
61///
62
63#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
64pub struct IcMetricObservation {
65    /// Observation timestamp as Unix seconds.
66    pub timestamp_unix_secs: u64,
67    /// Raw value string returned by the Dashboard.
68    pub value: String,
69}
70
71///
72/// IcMetricSeries
73///
74/// One named raw series in a Dashboard metric response.
75///
76
77#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
78pub struct IcMetricSeries {
79    /// Raw Dashboard response field that names this series.
80    pub name: String,
81    /// Observations in strictly increasing timestamp order.
82    pub observations: Vec<IcMetricObservation>,
83}
84
85///
86/// IcMetricReport
87///
88/// One bounded time-series response from the official Dashboard Metrics API.
89///
90
91#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
92pub struct IcMetricReport {
93    /// Shared Dashboard provenance, flattened in serialized report JSON.
94    #[serde(flatten)]
95    pub provenance: IcDashboardReportProvenance,
96    /// Metric and explicit time-series bounds, flattened in report JSON.
97    #[serde(flatten)]
98    pub query: IcMetricQuery,
99    /// Number of named series returned by the API.
100    pub returned_series_count: usize,
101    /// Total number of observations across all returned series.
102    pub returned_observation_count: usize,
103    /// Raw named time series in canonical series-name order.
104    pub series: Vec<IcMetricSeries>,
105}
106
107///
108/// IcIcrcTotalSupplyObservation
109///
110/// One raw ICRC ledger total-supply observation returned by the Dashboard API.
111///
112
113#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
114pub struct IcIcrcTotalSupplyObservation {
115    /// Observation timestamp as Unix seconds.
116    pub timestamp_unix_secs: u64,
117    /// Raw total supply in ledger base units.
118    pub total_supply_base_units: String,
119}
120
121///
122/// IcIcrcTotalSupplyReport
123///
124/// One bounded total-supply series from the official Dashboard ICRC API.
125///
126
127#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
128pub struct IcIcrcTotalSupplyReport {
129    /// Shared Dashboard provenance, flattened in serialized report JSON.
130    #[serde(flatten)]
131    pub provenance: IcDashboardReportProvenance,
132    /// Canonical ICRC ledger canister principal requested from the API.
133    pub ledger_canister_id: String,
134    /// Exact requested time bounds, flattened in report JSON.
135    #[serde(flatten)]
136    pub query: IcIcrcTotalSupplyQuery,
137    /// Maximum observations implied by the requested inclusive window.
138    pub requested_observation_limit: u64,
139    /// Number of observations returned by the API.
140    pub returned_observation_count: usize,
141    /// Raw observations in strictly increasing timestamp order.
142    pub observations: Vec<IcIcrcTotalSupplyObservation>,
143}
144
145///
146/// IcIcrcIndexedCountReport
147///
148/// One current scalar count from the official Dashboard ICRC index.
149///
150
151#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
152pub struct IcIcrcIndexedCountReport {
153    /// Shared Dashboard provenance, flattened in serialized report JSON.
154    #[serde(flatten)]
155    pub provenance: IcDashboardReportProvenance,
156    /// Canonical ICRC ledger canister principal requested from the API.
157    pub ledger_canister_id: String,
158    /// Indexed resource represented by this count.
159    pub kind: IcIcrcIndexedCountKind,
160    /// Number of matching resources currently represented by the Dashboard index.
161    pub total: u64,
162}
163
164///
165/// IcIcrcTokenValueRow
166///
167/// One raw externally sourced token-value record returned by the Dashboard API.
168///
169
170#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
171pub struct IcIcrcTokenValueRow {
172    /// Raw legacy price field in USD, when returned.
173    pub price: Option<String>,
174    /// Raw legacy 24-hour volume field in USD, when returned.
175    pub volume_24h: Option<String>,
176    /// Raw explicit price-in-USD field, when returned.
177    pub price_usd: Option<String>,
178    /// Raw explicit 24-hour volume-in-USD field, when returned.
179    pub volume_24h_usd: Option<String>,
180    /// External value provider named by the Dashboard, when returned.
181    pub source: Option<String>,
182    /// External value-provider URL returned by the Dashboard, when present.
183    pub source_url: Option<String>,
184    /// Observation timestamp as Unix seconds.
185    pub timestamp_unix_secs: u64,
186}
187
188///
189/// IcIcrcTokenValueReport
190///
191/// One bounded token-value series from the official Dashboard ICRC API.
192///
193
194#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
195pub struct IcIcrcTokenValueReport {
196    /// Shared Dashboard provenance, flattened in serialized report JSON.
197    #[serde(flatten)]
198    pub provenance: IcDashboardReportProvenance,
199    /// Canonical ICRC ledger canister principal requested from the API.
200    pub ledger_canister_id: String,
201    /// Exact requested time and row bounds, flattened in report JSON.
202    #[serde(flatten)]
203    pub query: IcIcrcTokenValueQuery,
204    /// Number of rows returned by the API.
205    pub returned_row_count: usize,
206    /// Whether the response reached the requested limit and may be truncated.
207    pub limit_reached: bool,
208    /// Raw token-value rows in nondecreasing timestamp order.
209    pub rows: Vec<IcIcrcTokenValueRow>,
210}
211
212///
213/// IcDailyStatsRow
214///
215/// Selected raw daily network-activity values returned by the Dashboard API.
216///
217
218#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
219pub struct IcDailyStatsRow {
220    /// Raw UTC calendar day returned by the Dashboard.
221    pub day: String,
222    /// Observation timestamp as Unix seconds.
223    pub timestamp_unix_secs: u64,
224    /// Raw average query-transaction rate.
225    pub average_query_transactions_per_second: String,
226    /// Raw average update-transaction rate.
227    pub average_update_transactions_per_second: String,
228    /// Raw average total-transaction rate.
229    pub average_transactions_per_second: String,
230    /// Raw maximum query-transaction rate.
231    pub max_query_transactions_per_second: String,
232    /// Raw maximum update-transaction rate.
233    pub max_update_transactions_per_second: String,
234    /// Raw maximum total-transaction rate.
235    pub max_total_transactions_per_second: String,
236    /// Raw average block-production rate.
237    pub blocks_per_second_average: String,
238}
239
240///
241/// IcDailyStatsReport
242///
243/// One bounded daily network-activity response from the official Dashboard API.
244///
245
246#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
247pub struct IcDailyStatsReport {
248    /// Shared Dashboard provenance, flattened in serialized report JSON.
249    #[serde(flatten)]
250    pub provenance: IcDashboardReportProvenance,
251    /// Exact requested time bounds, flattened in report JSON.
252    #[serde(flatten)]
253    pub query: IcDailyStatsQuery,
254    /// Number of daily rows returned by the API.
255    pub returned_day_count: usize,
256    /// Rows in strictly increasing timestamp order.
257    pub rows: Vec<IcDailyStatsRow>,
258}
259
260///
261/// IcBoundaryNodeDataCenterRow
262///
263/// One raw data-center aggregate returned by the boundary-node API.
264///
265
266#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
267pub struct IcBoundaryNodeDataCenterRow {
268    /// Dashboard data-center identifier.
269    pub dc_id: String,
270    /// Raw data-center display name.
271    pub name: String,
272    /// Raw infrastructure-owner label.
273    pub owner: String,
274    /// Raw Dashboard region label.
275    pub region: String,
276    /// Raw decimal latitude.
277    pub latitude: String,
278    /// Raw decimal longitude.
279    pub longitude: String,
280    /// Raw decimal count of boundary nodes assigned to this data center.
281    pub total_nodes: String,
282}
283
284///
285/// IcBoundaryNodeDataCentersReport
286///
287/// One complete response from the official boundary-node data-center resource.
288///
289
290#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
291pub struct IcBoundaryNodeDataCentersReport {
292    /// Shared Dashboard provenance, flattened in serialized report JSON.
293    #[serde(flatten)]
294    pub provenance: IcDashboardReportProvenance,
295    /// Number of data-center rows returned by the API.
296    pub data_center_count: usize,
297    /// Sum of the raw per-data-center boundary-node counts.
298    pub total_node_count: u64,
299    /// Rows in canonical data-center-id order, including zero-node locations.
300    pub rows: Vec<IcBoundaryNodeDataCenterRow>,
301}
302
303///
304/// IcNodeProviderRewardXdrConversionRate
305///
306/// XDR conversion-rate evidence recorded with one node-provider reward.
307///
308
309#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
310pub struct IcNodeProviderRewardXdrConversionRate {
311    /// Conversion-rate timestamp as Unix seconds, when present in the record.
312    #[serde(skip_serializing_if = "Option::is_none")]
313    pub timestamp_unix_secs: Option<u64>,
314    /// XDR per ICP multiplied by 10,000, when present in the record.
315    #[serde(skip_serializing_if = "Option::is_none")]
316    pub xdr_permyriad_per_icp: Option<u64>,
317}
318
319///
320/// IcNodeProviderRewardRow
321///
322/// One raw node-provider reward record returned by the official Dashboard API.
323///
324
325#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
326pub struct IcNodeProviderRewardRow {
327    /// Dashboard reward record id.
328    pub reward_id: u64,
329    /// Reward amount in raw ICP e8s.
330    pub amount_e8s: u64,
331    /// Mode-specific raw reward details preserved as a JSON object.
332    pub details: BTreeMap<String, serde_json::Value>,
333    /// Maximum node-provider reward in e8s used for this record, when available.
334    pub maximum_node_provider_rewards_e8s: Option<u64>,
335    /// Minimum XDR-permyriad-per-ICP floor used for this record, when available.
336    pub minimum_xdr_permyriad_per_icp: Option<u64>,
337    /// Canonical node-provider principal.
338    pub node_provider_id: String,
339    /// NNS proposal associated with this reward, when recorded by the Dashboard.
340    pub proposal_id: Option<u64>,
341    /// Registry version associated with this reward, when recorded by the Dashboard.
342    pub registry_version: Option<u64>,
343    /// Raw mode name so additive Dashboard reward modes remain visible.
344    pub reward_mode: String,
345    /// Reward timestamp as Unix seconds.
346    pub reward_timestamp_unix_secs: u64,
347    /// Raw Dashboard database update timestamp.
348    pub dashboard_updated_at: String,
349    /// XDR conversion-rate evidence, empty for historical records that predate it.
350    pub xdr_conversion_rate: IcNodeProviderRewardXdrConversionRate,
351}
352
353///
354/// IcNodeProviderRewardListReport
355///
356/// One explicitly bounded node-provider reward page from the official Dashboard API.
357///
358
359#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
360pub struct IcNodeProviderRewardListReport {
361    /// Shared Dashboard provenance, flattened in serialized report JSON.
362    #[serde(flatten)]
363    pub provenance: IcDashboardReportProvenance,
364    /// Exact requested page bounds, flattened in report JSON.
365    #[serde(flatten)]
366    pub query: IcNodeProviderRewardListQuery,
367    /// Reward-index ceiling selected by the Dashboard for this page series.
368    pub resolved_max_reward_index: u64,
369    /// Number of reward records matching the selected reward-index ceiling.
370    pub total_reward_records: u64,
371    /// Number of rows returned in this page.
372    pub returned_count: usize,
373    /// Arithmetic offset hint for an explicit later request, when more records remain.
374    pub next_offset_hint: Option<u64>,
375    /// Whether adjacent upstream offset pages can contain overlapping record ids.
376    pub pages_may_overlap: bool,
377    /// Reward rows in the exact order returned by the Dashboard.
378    pub rows: Vec<IcNodeProviderRewardRow>,
379}
380
381///
382/// IcNodeProviderRewardInfoReport
383///
384/// One exact node-provider reward record from the official Dashboard API.
385///
386
387#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
388pub struct IcNodeProviderRewardInfoReport {
389    /// Shared Dashboard provenance, flattened in serialized report JSON.
390    #[serde(flatten)]
391    pub provenance: IcDashboardReportProvenance,
392    /// Exact reward record, flattened in serialized report JSON.
393    #[serde(flatten)]
394    pub reward: IcNodeProviderRewardRow,
395}
396
397///
398/// IcNodeProviderRewardHistoryObservation
399///
400/// One aggregate reward amount returned by the Dashboard history endpoint.
401///
402
403#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
404pub struct IcNodeProviderRewardHistoryObservation {
405    /// Observation timestamp as Unix seconds.
406    pub timestamp_unix_secs: u64,
407    /// Aggregate node-provider reward amount in raw ICP e8s.
408    pub amount_e8s: u64,
409}
410
411///
412/// IcNodeProviderRewardHistoryReport
413///
414/// One bounded aggregate node-provider reward history response.
415///
416
417#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
418pub struct IcNodeProviderRewardHistoryReport {
419    /// Shared Dashboard provenance, flattened in serialized report JSON.
420    #[serde(flatten)]
421    pub provenance: IcDashboardReportProvenance,
422    /// Exact requested history bounds, flattened in report JSON.
423    #[serde(flatten)]
424    pub query: IcNodeProviderRewardHistoryQuery,
425    /// Maximum observations implied by the requested inclusive window.
426    pub requested_observation_limit: u64,
427    /// Number of observations returned by the API.
428    pub returned_observation_count: usize,
429    /// Aggregate observations in strictly increasing timestamp order.
430    pub observations: Vec<IcNodeProviderRewardHistoryObservation>,
431}
432
433///
434/// IcReplicaVersionStatus
435///
436/// Raw lifecycle status exposed by the official Dashboard release index.
437///
438
439#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize)]
440#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
441pub enum IcReplicaVersionStatus {
442    /// The election proposal has been adopted but not executed.
443    Adopted,
444    /// The election proposal has executed.
445    Executed,
446    /// The election proposal remains open.
447    Open,
448}
449
450impl IcReplicaVersionStatus {
451    /// Return the exact official Dashboard query value.
452    #[must_use]
453    pub const fn as_dashboard_value(self) -> &'static str {
454        match self {
455            Self::Adopted => "ADOPTED",
456            Self::Executed => "EXECUTED",
457            Self::Open => "OPEN",
458        }
459    }
460}
461
462impl fmt::Display for IcReplicaVersionStatus {
463    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
464        formatter.write_str(self.as_dashboard_value())
465    }
466}
467
468///
469/// IcReplicaVersionSubnetRollout
470///
471/// One Dashboard-recorded proposal assigning a Subnet to a replica version.
472///
473
474#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
475pub struct IcReplicaVersionSubnetRollout {
476    /// Canonical Subnet principal.
477    pub subnet_id: String,
478    /// NNS proposal that assigned the Subnet to this version.
479    pub proposal_id: u64,
480    /// Proposal execution time as raw Unix seconds.
481    pub executed_timestamp_seconds: u64,
482}
483
484///
485/// IcReplicaVersionListRow
486///
487/// One release-election row from a bounded official Dashboard page.
488///
489
490#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
491pub struct IcReplicaVersionListRow {
492    /// Lowercase hexadecimal replica-version identifier.
493    pub replica_version_id: String,
494    /// NNS proposal that elected this version.
495    pub proposal_id: u64,
496    /// Election proposal execution time, or zero before execution.
497    pub executed_timestamp_seconds: u64,
498    /// Raw Dashboard proposal lifecycle status.
499    pub status: IcReplicaVersionStatus,
500    /// Raw proposal title.
501    pub title: String,
502    /// Raw proposal discussion URL.
503    pub url: String,
504    /// Number of Dashboard-recorded Subnet assignments.
505    pub subnet_count: usize,
506    /// Dashboard-recorded Subnet assignments in execution order.
507    pub subnets: Vec<IcReplicaVersionSubnetRollout>,
508}
509
510///
511/// IcReplicaVersionListReport
512///
513/// One explicitly bounded replica-version page from the official Dashboard API.
514///
515
516#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
517pub struct IcReplicaVersionListReport {
518    /// Shared Dashboard provenance, flattened in serialized report JSON.
519    #[serde(flatten)]
520    pub provenance: IcDashboardReportProvenance,
521    /// Exact requested page bounds, flattened in report JSON.
522    #[serde(flatten)]
523    pub query: IcReplicaVersionListQuery,
524    /// Proposal-index ceiling selected by the Dashboard for this page series.
525    pub resolved_max_proposal_index: u64,
526    /// Number of release records matching the selected proposal-index ceiling.
527    pub total_proposals: u64,
528    /// Number of rows returned in this page.
529    pub returned_count: usize,
530    /// Offset for an explicit next-page request, when more rows remain.
531    pub next_offset: Option<u64>,
532    /// Release rows in the Dashboard's requested descending execution-time order.
533    pub rows: Vec<IcReplicaVersionListRow>,
534}
535
536///
537/// IcReplicaVersionInfoReport
538///
539/// One exact replica-version release record from the official Dashboard API.
540///
541
542#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
543pub struct IcReplicaVersionInfoReport {
544    /// Shared Dashboard provenance, flattened in serialized report JSON.
545    #[serde(flatten)]
546    pub provenance: IcDashboardReportProvenance,
547    /// Lowercase hexadecimal replica-version identifier.
548    pub replica_version_id: String,
549    /// NNS proposal that elected this version.
550    pub proposal_id: u64,
551    /// Election proposal execution time as raw Unix seconds.
552    pub executed_timestamp_seconds: u64,
553    /// Raw proposal title.
554    pub title: String,
555    /// Raw proposal discussion URL.
556    pub url: String,
557    /// Raw release-note summary.
558    pub summary: String,
559    /// Number of Dashboard-recorded Subnet assignments.
560    pub subnet_count: usize,
561    /// Dashboard-recorded Subnet assignments in execution order.
562    pub subnets: Vec<IcReplicaVersionSubnetRollout>,
563}
564
565///
566/// IcCanisterReport
567///
568/// One live canister metadata report from the official Dashboard API.
569///
570
571#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
572pub struct IcCanisterReport {
573    /// Shared Dashboard provenance, flattened in serialized report JSON.
574    #[serde(flatten)]
575    pub provenance: IcDashboardReportProvenance,
576    /// Canonical canister principal.
577    pub canister_id: String,
578    /// Dashboard database row identifier.
579    pub dashboard_id: u64,
580    /// Raw optional Dashboard canister classification.
581    pub canister_type: Option<String>,
582    /// Raw Dashboard canister name; an empty string means no name was recorded.
583    pub name: String,
584    /// Canonical Subnet principal recorded by the Dashboard.
585    pub subnet_id: String,
586    /// Canonically ordered controller principals recorded by the Dashboard.
587    pub controllers: Vec<String>,
588    /// Raw Dashboard language label; an empty string means no language was recorded.
589    pub language: String,
590    /// Raw current module hash; an empty string means no hash was recorded.
591    pub module_hash: String,
592    /// Raw Dashboard row update timestamp.
593    pub dashboard_updated_at: String,
594    /// Number of proposal-linked upgrades when history is available.
595    pub upgrade_count: Option<usize>,
596    /// Proposal-linked upgrade history, or `None` when the Dashboard returned `null`.
597    pub upgrades: Option<Vec<IcCanisterUpgrade>>,
598}
599
600///
601/// IcCanisterCountReport
602///
603/// One filtered canister count from the official Dashboard API.
604///
605
606#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
607pub struct IcCanisterCountReport {
608    /// Shared Dashboard provenance, flattened in serialized report JSON.
609    #[serde(flatten)]
610    pub provenance: IcDashboardReportProvenance,
611    /// Filters applied by the Dashboard.
612    pub filters: IcCanisterFilters,
613    /// Number of matching Dashboard canister records.
614    pub total: u64,
615}
616
617///
618/// IcCanisterPageController
619///
620/// One controller entry returned by the Dashboard canister collection API.
621///
622
623#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
624pub struct IcCanisterPageController {
625    /// Canonical controller principal.
626    pub principal_id: String,
627    /// Raw optional Dashboard metadata associated with the controller.
628    pub raw_metadata: Option<String>,
629}
630
631///
632/// IcCanisterPageRow
633///
634/// One discovery row from a bounded Dashboard canister page.
635///
636
637#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
638pub struct IcCanisterPageRow {
639    /// Canonical canister principal.
640    pub canister_id: String,
641    /// Dashboard database row identifier.
642    pub dashboard_id: u64,
643    /// Raw optional Dashboard canister classification.
644    pub canister_type: Option<String>,
645    /// Raw Dashboard canister name.
646    pub name: String,
647    /// Canonical Subnet principal recorded by the Dashboard.
648    pub subnet_id: String,
649    /// Canonically ordered controller entries recorded by the Dashboard.
650    pub controllers: Vec<IcCanisterPageController>,
651    /// Raw Dashboard language label.
652    pub language: String,
653    /// Raw current module hash.
654    pub module_hash: String,
655    /// Raw Dashboard row update timestamp.
656    pub dashboard_updated_at: String,
657}
658
659///
660/// IcCanisterPageReport
661///
662/// One explicitly bounded page from the official Dashboard canister collection.
663///
664
665#[derive(Clone, Debug, Eq, PartialEq, Serialize)]
666pub struct IcCanisterPageReport {
667    /// Shared Dashboard provenance, flattened in serialized report JSON.
668    #[serde(flatten)]
669    pub provenance: IcDashboardReportProvenance,
670    /// Filters applied by the Dashboard.
671    pub filters: IcCanisterFilters,
672    /// Maximum rows requested from the API.
673    pub requested_limit: u16,
674    /// Number of rows returned in this report.
675    pub returned_count: usize,
676    /// Exclusive forward cursor supplied to this request.
677    pub after: Option<String>,
678    /// Exclusive backward cursor supplied to this request.
679    pub before: Option<String>,
680    /// Cursor for an explicit request for the preceding page.
681    pub previous_cursor: Option<String>,
682    /// Cursor for an explicit request for the following page.
683    pub next_cursor: Option<String>,
684    /// Canister discovery rows in Dashboard canister-id order.
685    pub rows: Vec<IcCanisterPageRow>,
686}