Skip to main content

ic_query/sns/report/model/reports/
invocation.rs

1//! Module: sns::report::model::reports::invocation
2//!
3//! Responsibility: shared typed provenance for native SNS canister invocations.
4//! Does not own: transport, source validation, report assembly, or rendering.
5//! Boundary: defines the closed call types and methods used by bounded SNS reports.
6
7use serde::{Deserialize, Serialize};
8
9///
10/// SnsCanisterCallType
11///
12/// Invocation mode used for a native SNS canister method.
13///
14
15#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
16#[serde(rename_all = "snake_case")]
17pub enum SnsCanisterCallType {
18    /// A non-replicated query call.
19    Query,
20    /// A non-replicated composite query call.
21    CompositeQuery,
22    /// A replicated update submitted through ingress.
23    IngressUpdate,
24}
25
26impl SnsCanisterCallType {
27    /// Return the stable JSON and text label.
28    #[must_use]
29    pub const fn as_str(self) -> &'static str {
30        match self {
31            Self::Query => "query",
32            Self::CompositeQuery => "composite_query",
33            Self::IngressUpdate => "ingress_update",
34        }
35    }
36}
37
38///
39/// SnsCanisterMethod
40///
41/// Native canister method invoked or recorded by a typed SNS report adapter.
42///
43
44#[derive(Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
45#[serde(rename_all = "snake_case")]
46pub enum SnsCanisterMethod {
47    /// SNS-W deployed-instance inventory query.
48    ListDeployedSnses,
49    /// SNS Governance metadata query.
50    GetMetadata,
51    /// SNS Root inventory query.
52    ListSnsCanisters,
53    /// SNS Root operational-health update.
54    GetSnsCanistersSummary,
55    /// SNS Governance cached-metrics composite query.
56    GetMetrics,
57    /// SNS Governance nervous-system-parameters query.
58    GetNervousSystemParameters,
59    /// SNS Governance bounded proposal-list query.
60    ListProposals,
61    /// SNS Governance exact proposal query.
62    GetProposal,
63    /// SNS Governance bounded neuron-list query.
64    ListNeurons,
65    /// SNS Governance exact neuron query.
66    GetNeuron,
67    /// SNS Governance latest-reward-event query.
68    GetLatestRewardEvent,
69    /// SNS swap lifecycle query.
70    GetLifecycle,
71    /// SNS swap sale-parameters query.
72    GetSaleParameters,
73    /// SNS swap derived-state query.
74    GetDerivedState,
75    /// SNS Governance running-version query.
76    GetRunningSnsVersion,
77    /// SNS-W next-blessed-version query.
78    GetNextSnsVersion,
79}
80
81impl SnsCanisterMethod {
82    /// Return the exact native Candid method name.
83    #[must_use]
84    pub const fn as_str(self) -> &'static str {
85        match self {
86            Self::ListDeployedSnses => "list_deployed_snses",
87            Self::GetMetadata => "get_metadata",
88            Self::ListSnsCanisters => "list_sns_canisters",
89            Self::GetSnsCanistersSummary => "get_sns_canisters_summary",
90            Self::GetMetrics => "get_metrics",
91            Self::GetNervousSystemParameters => "get_nervous_system_parameters",
92            Self::ListProposals => "list_proposals",
93            Self::GetProposal => "get_proposal",
94            Self::ListNeurons => "list_neurons",
95            Self::GetNeuron => "get_neuron",
96            Self::GetLatestRewardEvent => "get_latest_reward_event",
97            Self::GetLifecycle => "get_lifecycle",
98            Self::GetSaleParameters => "get_sale_parameters",
99            Self::GetDerivedState => "get_derived_state",
100            Self::GetRunningSnsVersion => "get_running_sns_version",
101            Self::GetNextSnsVersion => "get_next_sns_version",
102        }
103    }
104}
105
106#[cfg(test)]
107mod tests {
108    use super::*;
109
110    #[test]
111    fn canister_call_type_labels_round_trip() {
112        for (call_type, label) in [
113            (SnsCanisterCallType::Query, "query"),
114            (SnsCanisterCallType::CompositeQuery, "composite_query"),
115            (SnsCanisterCallType::IngressUpdate, "ingress_update"),
116        ] {
117            assert_json_label(call_type, label);
118            assert_eq!(call_type.as_str(), label);
119        }
120    }
121
122    #[test]
123    fn canister_method_labels_round_trip() {
124        for (method, label) in [
125            (SnsCanisterMethod::ListDeployedSnses, "list_deployed_snses"),
126            (SnsCanisterMethod::GetMetadata, "get_metadata"),
127            (SnsCanisterMethod::ListSnsCanisters, "list_sns_canisters"),
128            (
129                SnsCanisterMethod::GetSnsCanistersSummary,
130                "get_sns_canisters_summary",
131            ),
132            (SnsCanisterMethod::GetMetrics, "get_metrics"),
133            (
134                SnsCanisterMethod::GetNervousSystemParameters,
135                "get_nervous_system_parameters",
136            ),
137            (SnsCanisterMethod::ListProposals, "list_proposals"),
138            (SnsCanisterMethod::GetProposal, "get_proposal"),
139            (SnsCanisterMethod::ListNeurons, "list_neurons"),
140            (SnsCanisterMethod::GetNeuron, "get_neuron"),
141            (
142                SnsCanisterMethod::GetLatestRewardEvent,
143                "get_latest_reward_event",
144            ),
145            (SnsCanisterMethod::GetLifecycle, "get_lifecycle"),
146            (SnsCanisterMethod::GetSaleParameters, "get_sale_parameters"),
147            (SnsCanisterMethod::GetDerivedState, "get_derived_state"),
148            (
149                SnsCanisterMethod::GetRunningSnsVersion,
150                "get_running_sns_version",
151            ),
152            (SnsCanisterMethod::GetNextSnsVersion, "get_next_sns_version"),
153        ] {
154            assert_json_label(method, label);
155            assert_eq!(method.as_str(), label);
156        }
157    }
158
159    fn assert_json_label<T>(value: T, label: &str)
160    where
161        T: Copy + std::fmt::Debug + Eq + Serialize + serde::de::DeserializeOwned,
162    {
163        assert_eq!(
164            serde_json::to_string(&value).unwrap(),
165            format!("\"{label}\"")
166        );
167        assert_eq!(
168            serde_json::from_str::<T>(&format!("\"{label}\"")).unwrap(),
169            value
170        );
171    }
172}