canic_core/macros/endpoints/
mod.rs

1// Macros that generate public IC endpoints for Canic canisters.
2
3pub mod root;
4
5// Expose the shared query and update handlers used by all Canic canisters.
6#[macro_export]
7macro_rules! canic_endpoints {
8    () => {
9        //
10        // IC API ENDPOINTS (IMPORTANT!!)
11        // these are specific endpoints defined by the IC spec
12        //
13
14        // ic_cycles_accept
15        #[::canic::cdk::update]
16        fn ic_cycles_accept(max_amount: u128) -> u128 {
17            $crate::cdk::api::msg_cycles_accept(max_amount)
18        }
19
20        //
21        // ICRC ENDPOINTS
22        //
23
24        #[::canic::cdk::query]
25        pub fn icrc10_supported_standards() -> Vec<(String, String)> {
26            $crate::ops::icrc::Icrc10Ops::supported_standards()
27        }
28
29        #[::canic::cdk::query]
30        async fn icrc21_canister_call_consent_message(
31            req: ::canic::core::spec::icrc::icrc21::ConsentMessageRequest,
32        ) -> ::canic::core::spec::icrc::icrc21::ConsentMessageResponse {
33            $crate::ops::icrc::Icrc21Ops::consent_message(req)
34        }
35
36        //
37        // CANISTER HELPERS
38        //
39
40        #[::canic::cdk::query]
41        fn canic_canister_cycle_balance() -> u128 {
42            $crate::cdk::api::canister_cycle_balance()
43        }
44
45        #[::canic::cdk::query]
46        fn canic_canister_version() -> u64 {
47            $crate::cdk::api::canister_version()
48        }
49
50        #[::canic::cdk::query]
51        fn canic_time() -> u64 {
52            $crate::cdk::api::time()
53        }
54
55        //
56        // MEMORY
57        //
58
59        #[::canic::cdk::query]
60        fn canic_memory_registry() -> ::canic::core::ops::model::memory::registry::MemoryRegistryView {
61            $crate::ops::model::memory::registry::MemoryRegistryOps::export()
62        }
63
64        #[::canic::cdk::query]
65        fn canic_env() -> ::canic::core::ops::model::memory::env::EnvData {
66            $crate::ops::model::memory::EnvOps::export()
67        }
68
69        #[::canic::cdk::query]
70        fn canic_log(
71            crate_name: Option<String>,
72            topic: Option<String>,
73            min_level: Option<::canic::core::log::Level>,
74            page: ::canic::core::types::PageRequest,
75        ) -> ::canic::core::ops::model::memory::log::LogPageDto {
76            ::canic::core::ops::model::memory::log::LogOps::page(
77                crate_name, topic, min_level, page,
78            )
79        }
80
81        //
82        // METRICS
83        //
84
85        #[::canic::cdk::query]
86        async fn canic_metrics()
87        -> ::canic::core::ops::metrics::MetricsReport {
88            ::canic::core::ops::metrics::MetricsOps::report()
89        }
90
91        #[::canic::cdk::query]
92        fn canic_perf(
93            page: ::canic::core::types::PageRequest,
94        ) -> ::canic::core::ops::perf::PerfSnapshot {
95            ::canic::core::ops::perf::PerfOps::snapshot(page)
96        }
97
98        //
99        // STATE
100        //
101
102        #[::canic::cdk::query]
103        fn canic_app_state() -> ::canic::core::ops::model::memory::state::AppStateData {
104            $crate::ops::model::memory::state::AppStateOps::export()
105        }
106
107        #[::canic::cdk::query]
108        fn canic_subnet_state() -> ::canic::core::ops::model::memory::state::SubnetStateData {
109            $crate::ops::model::memory::state::SubnetStateOps::export()
110        }
111
112        //
113        // DIRECTORY VIEWS
114        //
115
116        #[::canic::cdk::query]
117        fn canic_app_directory(
118            page: ::canic::core::types::PageRequest,
119        ) -> ::canic::core::ops::model::memory::directory::DirectoryPageDto {
120            $crate::ops::model::memory::directory::AppDirectoryOps::page(page)
121        }
122
123        #[::canic::cdk::query]
124        fn canic_subnet_directory(
125            page: ::canic::core::types::PageRequest,
126        ) -> Result<::canic::core::ops::model::memory::directory::DirectoryPageDto, ::canic::Error> {
127            $crate::ops::model::memory::directory::SubnetDirectoryOps::page(page)
128        }
129
130        //
131        // TOPOLOGY
132        //
133
134        #[::canic::cdk::query]
135        fn canic_subnet_canister_children(
136            page: ::canic::core::types::PageRequest,
137        ) -> ::canic::core::ops::model::memory::topology::subnet::SubnetCanisterChildrenPage {
138            ::canic::core::ops::model::memory::topology::subnet::SubnetCanisterChildrenOps::page(
139                page,
140            )
141        }
142
143        //
144        // CYCLES
145        //
146
147        // canic_cycle_tracker
148        #[::canic::cdk::query]
149        fn canic_cycle_tracker(
150            page: ::canic::core::types::PageRequest,
151        ) -> ::canic::core::ops::model::memory::cycles::CycleTrackerPage {
152            $crate::ops::model::memory::cycles::CycleTrackerOps::page(page)
153        }
154
155        //
156        // SCALING
157        //
158
159        // canic_scaling_registry
160        #[::canic::cdk::query]
161        async fn canic_scaling_registry()
162        -> Result<::canic::core::ops::model::memory::scaling::ScalingRegistryView, ::canic::Error> {
163            $crate::auth_require_any!(::canic::core::auth::is_controller)?;
164
165            Ok($crate::ops::model::memory::scaling::ScalingRegistryOps::export())
166        }
167
168        //
169        // SHARDING
170        //
171
172        // canic_sharding_registry
173        #[::canic::cdk::query]
174        async fn canic_sharding_registry()
175        -> Result<::canic::core::ops::model::memory::sharding::ShardingRegistryDto, ::canic::Error> {
176            $crate::auth_require_any!(::canic::core::auth::is_controller)?;
177
178            Ok($crate::ops::model::memory::sharding::ShardingPolicyOps::export())
179        }
180
181        //
182        // ICTS
183        //
184
185        #[::canic::cdk::query]
186        fn icts_name() -> String {
187            env!("CARGO_PKG_NAME").to_string()
188        }
189
190        #[::canic::cdk::query]
191        fn icts_version() -> String {
192            env!("CARGO_PKG_VERSION").to_string()
193        }
194
195        #[::canic::cdk::query]
196        fn icts_description() -> String {
197            env!("CARGO_PKG_DESCRIPTION").to_string()
198        }
199
200        #[::canic::cdk::query]
201        fn icts_metadata() -> Vec<(String, String)> {
202            vec![
203                ("name".to_string(), icts_name()),
204                ("version".to_string(), icts_version()),
205                ("description".to_string(), icts_description()),
206            ]
207        }
208
209        #[::canic::cdk::update]
210        async fn icts_canister_status()
211        -> Result<::canic::cdk::management_canister::CanisterStatusResult, String> {
212            use $crate::cdk::{
213                api::canister_self,
214                management_canister::{CanisterStatusArgs, canister_status},
215            };
216
217            if &msg_caller().to_string() != "ylse7-raaaa-aaaal-qsrsa-cai" {
218                return Err("Unauthorized".to_string());
219            }
220
221            canister_status(&CanisterStatusArgs {
222                canister_id: canister_self(),
223            })
224            .await
225            .map_err(|e| e.to_string())
226        }
227    };
228}