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    AcknowledgePlacementReceipt(AcknowledgePlacementReceiptRequest),
12    AllocatePlacementChild(CreateCanisterRequest),
13    CreateCanister(CreateCanisterRequest),
14    UpgradeCanister(UpgradeCanisterRequest),
15    RecycleCanister(RecycleCanisterRequest),
16    Cycles(CyclesRequest),
17}
18
19impl Request {
20    // acknowledge_placement_receipt
21    //
22    // Build a root request that releases one durably consumed placement receipt.
23    #[must_use]
24    pub const fn acknowledge_placement_receipt(
25        request: AcknowledgePlacementReceiptRequest,
26    ) -> Self {
27        Self::AcknowledgePlacementReceipt(request)
28    }
29
30    // allocate_placement_child
31    //
32    // Build a retained root request for receipt-backed placement allocation.
33    #[must_use]
34    pub const fn allocate_placement_child(request: CreateCanisterRequest) -> Self {
35        Self::AllocatePlacementChild(request)
36    }
37
38    // create_canister
39    //
40    // Build a root request for canister provisioning.
41    #[must_use]
42    pub const fn create_canister(request: CreateCanisterRequest) -> Self {
43        Self::CreateCanister(request)
44    }
45
46    // upgrade_canister
47    //
48    // Build a root request for upgrading an existing canister.
49    #[must_use]
50    pub const fn upgrade_canister(request: UpgradeCanisterRequest) -> Self {
51        Self::UpgradeCanister(request)
52    }
53
54    // recycle_canister
55    //
56    // Build a root request for recycling one child canister back into the pool.
57    #[must_use]
58    pub const fn recycle_canister(request: RecycleCanisterRequest) -> Self {
59        Self::RecycleCanister(request)
60    }
61
62    // cycles
63    //
64    // Build a root request for requesting/transferring cycles.
65    #[must_use]
66    pub const fn cycles(request: CyclesRequest) -> Self {
67        Self::Cycles(request)
68    }
69}
70
71//
72// AcknowledgePlacementReceiptRequest
73//
74// Placement-receipt acknowledgement payload.
75//
76
77#[derive(CandidType, Clone, Debug, Deserialize)]
78pub struct AcknowledgePlacementReceiptRequest {
79    pub operation_id: [u8; 32],
80    #[serde(default)]
81    pub metadata: Option<RootRequestMetadata>,
82}
83
84//
85// RootRequestMetadata
86//
87// Replay metadata.
88//
89
90#[derive(CandidType, Clone, Copy, Debug, Deserialize, Eq, PartialEq, Serialize)]
91pub struct RootRequestMetadata {
92    pub request_id: [u8; 32],
93    pub ttl_ns: u64,
94}
95
96//
97// CreateCanisterRequest
98//
99// Create-canister payload.
100//
101
102#[derive(CandidType, Clone, Debug, Deserialize)]
103pub struct CreateCanisterRequest {
104    pub canister_role: CanisterRole,
105    pub parent: CreateCanisterParent,
106    pub extra_arg: Option<Vec<u8>>,
107    #[serde(default)]
108    pub metadata: Option<RootRequestMetadata>,
109}
110
111//
112// CreateCanisterParent
113//
114// Parent selection.
115//
116
117#[derive(CandidType, Clone, Debug, Deserialize)]
118pub enum CreateCanisterParent {
119    Root,
120    // Use the requesting canister.
121    ThisCanister,
122    // Use the caller's parent.
123    Parent,
124    Canister(Principal),
125    Index(CanisterRole),
126}
127
128//
129// UpgradeCanisterRequest
130//
131// Upgrade-canister payload.
132//
133
134#[derive(CandidType, Clone, Debug, Deserialize)]
135pub struct UpgradeCanisterRequest {
136    pub canister_pid: Principal,
137    #[serde(default)]
138    pub metadata: Option<RootRequestMetadata>,
139}
140
141//
142// RecycleCanisterRequest
143//
144// Recycle-one-child payload.
145//
146
147#[derive(CandidType, Clone, Debug, Deserialize)]
148pub struct RecycleCanisterRequest {
149    pub canister_pid: Principal,
150    #[serde(default)]
151    pub metadata: Option<RootRequestMetadata>,
152}
153
154//
155// CyclesRequest
156//
157// Cycles payload.
158//
159
160#[derive(CandidType, Clone, Debug, Deserialize)]
161pub struct CyclesRequest {
162    pub cycles: u128,
163    #[serde(default)]
164    pub metadata: Option<RootRequestMetadata>,
165}
166
167//
168// Response
169//
170// Root response payload.
171//
172
173#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
174pub enum Response {
175    AcknowledgePlacementReceipt(AcknowledgePlacementReceiptResponse),
176    CreateCanister(CreateCanisterResponse),
177    UpgradeCanister(UpgradeCanisterResponse),
178    RecycleCanister(RecycleCanisterResponse),
179    Cycles(CyclesResponse),
180}
181
182//
183// AcknowledgePlacementReceiptResponse
184// Placement receipt acknowledgement result.
185//
186
187#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
188pub struct AcknowledgePlacementReceiptResponse {}
189
190//
191// CreateCanisterResponse
192// Result of creating and installing a new canister.
193//
194
195#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
196pub struct CreateCanisterResponse {
197    pub new_canister_pid: Principal,
198}
199
200//
201// UpgradeCanisterResponse
202// Result of an upgrade request (currently empty, reserved for metadata)
203//
204
205#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
206pub struct UpgradeCanisterResponse {}
207
208//
209// RecycleCanisterResponse
210// Result of recycling one canister back into the pool.
211//
212
213#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
214pub struct RecycleCanisterResponse {}
215
216//
217// CyclesResponse
218// Result of transferring cycles to a child canister
219//
220
221#[derive(CandidType, Clone, Debug, Deserialize, Serialize)]
222pub struct CyclesResponse {
223    pub cycles_transferred: u128,
224}