Skip to main content

canic_core/dto/
rpc.rs

1use crate::dto::prelude::*;
2
3//
4// Request
5//
6// Root orchestration request.
7//
8
9#[derive(CandidType, Clone, Debug, Deserialize)]
10pub enum Request {
11    CreateCanister(CreateCanisterRequest),
12    UpgradeCanister(UpgradeCanisterRequest),
13    RecycleCanister(RecycleCanisterRequest),
14    Cycles(CyclesRequest),
15}
16
17impl Request {
18    // create_canister
19    //
20    // Build a root request for canister provisioning.
21    #[must_use]
22    pub const fn create_canister(request: CreateCanisterRequest) -> Self {
23        Self::CreateCanister(request)
24    }
25
26    // upgrade_canister
27    //
28    // Build a root request for upgrading an existing canister.
29    #[must_use]
30    pub const fn upgrade_canister(request: UpgradeCanisterRequest) -> Self {
31        Self::UpgradeCanister(request)
32    }
33
34    // recycle_canister
35    //
36    // Build a root request for recycling one child canister back into the pool.
37    #[must_use]
38    pub const fn recycle_canister(request: RecycleCanisterRequest) -> Self {
39        Self::RecycleCanister(request)
40    }
41
42    // cycles
43    //
44    // Build a root request for requesting/transferring cycles.
45    #[must_use]
46    pub const fn cycles(request: CyclesRequest) -> Self {
47        Self::Cycles(request)
48    }
49}
50
51//
52// RootRequestMetadata
53//
54// Replay metadata.
55//
56
57#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
58pub struct RootRequestMetadata {
59    pub request_id: [u8; 32],
60    pub ttl_ns: u64,
61}
62
63//
64// CreateCanisterRequest
65//
66// Create-canister payload.
67//
68
69#[derive(CandidType, Clone, Debug, Deserialize)]
70pub struct CreateCanisterRequest {
71    pub canister_role: CanisterRole,
72    pub parent: CreateCanisterParent,
73    pub extra_arg: Option<Vec<u8>>,
74    #[serde(default)]
75    pub metadata: Option<RootRequestMetadata>,
76}
77
78//
79// CreateCanisterParent
80//
81// Parent selection.
82//
83
84#[derive(CandidType, Clone, Debug, Deserialize)]
85pub enum CreateCanisterParent {
86    Root,
87    // Use the requesting canister.
88    ThisCanister,
89    // Use the caller's parent.
90    Parent,
91    Canister(Principal),
92    Index(CanisterRole),
93}
94
95//
96// UpgradeCanisterRequest
97//
98// Upgrade-canister payload.
99//
100
101#[derive(CandidType, Clone, Debug, Deserialize)]
102pub struct UpgradeCanisterRequest {
103    pub canister_pid: Principal,
104    #[serde(default)]
105    pub metadata: Option<RootRequestMetadata>,
106}
107
108//
109// RecycleCanisterRequest
110//
111// Recycle-one-child payload.
112//
113
114#[derive(CandidType, Clone, Debug, Deserialize)]
115pub struct RecycleCanisterRequest {
116    pub canister_pid: Principal,
117    #[serde(default)]
118    pub metadata: Option<RootRequestMetadata>,
119}
120
121//
122// CyclesRequest
123//
124// Cycles payload.
125//
126
127#[derive(CandidType, Clone, Debug, Deserialize)]
128pub struct CyclesRequest {
129    pub cycles: u128,
130    #[serde(default)]
131    pub metadata: Option<RootRequestMetadata>,
132}
133
134//
135// Response
136//
137// Root response payload.
138//
139
140#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
141pub enum Response {
142    CreateCanister(CreateCanisterResponse),
143    UpgradeCanister(UpgradeCanisterResponse),
144    RecycleCanister(RecycleCanisterResponse),
145    Cycles(CyclesResponse),
146}
147
148//
149// CreateCanisterResponse
150// Result of creating and installing a new canister.
151//
152
153#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
154pub struct CreateCanisterResponse {
155    pub new_canister_pid: Principal,
156}
157
158//
159// UpgradeCanisterResponse
160// Result of an upgrade request (currently empty, reserved for metadata)
161//
162
163#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
164pub struct UpgradeCanisterResponse {}
165
166//
167// RecycleCanisterResponse
168// Result of recycling one canister back into the pool.
169//
170
171#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
172pub struct RecycleCanisterResponse {}
173
174//
175// CyclesResponse
176// Result of transferring cycles to a child canister
177//
178
179#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
180pub struct CyclesResponse {
181    pub cycles_transferred: u128,
182}