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}