wapo_env/
lib.rs

1//! Tools for writing wapo programs.
2
3// #![warn(missing_docs)]
4
5use core::{
6    future::Future,
7    ops::{Deref, DerefMut},
8    pin::Pin,
9    task,
10};
11use std::cell::RefCell;
12
13use crate::ocall_funcs_guest as ocall;
14use num_enum::{IntoPrimitive, TryFromPrimitive};
15use scale::{Decode, Encode};
16use tinyvec::TinyVec;
17
18pub use args_stack::RetEncode;
19pub use ocall_def::*;
20pub use tasks::spawn;
21pub use wapo_macro::main;
22
23mod args_stack;
24pub mod messages;
25mod ocall_def;
26pub mod tasks;
27pub mod tls;
28
29pub type IntPtr = i32;
30pub type IntRet = i64;
31
32#[derive(
33    Clone, Copy, Debug, derive_more::Display, IntoPrimitive, TryFromPrimitive, Encode, Decode,
34)]
35#[repr(u8)]
36pub enum OcallError {
37    Ok = 0,
38    /// The ocall function is not implemented.
39    UnknownCallNumber = 1,
40    /// Given argument is an invalid pointer.
41    InvalidAddress = 2,
42    /// Given argument is invalid.
43    InvalidParameter = 3,
44    /// Given argument is not well-formed.
45    InvalidEncoding = 4,
46    /// Run out of memory.
47    NoMemory = 5,
48    /// The resource is not found.
49    NotFound = 7,
50    /// The resource does not support current operation.
51    UnsupportedOperation = 8,
52    /// IO error.
53    IoError = 9,
54    /// Resource quota is exceeded.
55    ResourceLimited = 10,
56    /// The async poll is pending.
57    Pending = 11,
58    /// Read to the end of some stream-like resource.
59    EndOfFile = 12,
60    /// The gas is not enough.
61    GasExhausted = 13,
62    /// The gas is not enough for current poll.
63    Stifled = 14,
64    /// The create resource is already exists.
65    AlreadyExists = 15,
66    /// Reserved for future use
67    Reserved16 = 16,
68    /// Reserved for future use
69    Reserved17 = 17,
70    /// Reserved for future use
71    Reserved18 = 18,
72    /// Reserved for future use
73    Reserved19 = 19,
74    /// Reserved for future use
75    Reserved20 = 20,
76    /// Reserved for future use
77    Reserved21 = 21,
78    /// Reserved for future use
79    Reserved22 = 22,
80    /// Reserved for future use
81    Reserved23 = 23,
82    /// Reserved for future use
83    Reserved24 = 24,
84    /// Reserved for future use
85    Reserved25 = 25,
86    /// Reserved for future use
87    Reserved26 = 26,
88    /// Reserved for future use
89    Reserved27 = 27,
90    /// Reserved for future use
91    Reserved28 = 28,
92    /// Reserved for future use
93    Reserved29 = 29,
94    /// Reserved for future use
95    Reserved30 = 30,
96    /// Reserved for future use
97    Reserved31 = 31,
98    /// Reserved for future use
99    Reserved32 = 32,
100    /// Reserved for future use
101    Reserved33 = 33,
102    /// Reserved for future use
103    Reserved34 = 34,
104    /// Reserved for future use
105    Reserved35 = 35,
106    /// Reserved for future use
107    Reserved36 = 36,
108    /// Reserved for future use
109    Reserved37 = 37,
110    /// Reserved for future use
111    Reserved38 = 38,
112    /// Reserved for future use
113    Reserved39 = 39,
114    /// Reserved for future use
115    Reserved40 = 40,
116    /// Reserved for future use
117    Reserved41 = 41,
118    /// Reserved for future use
119    Reserved42 = 42,
120    /// Reserved for future use
121    Reserved43 = 43,
122    /// Reserved for future use
123    Reserved44 = 44,
124    /// Reserved for future use
125    Reserved45 = 45,
126    /// Reserved for future use
127    Reserved46 = 46,
128    /// Reserved for future use
129    Reserved47 = 47,
130    /// Reserved for future use
131    Reserved48 = 48,
132    /// Reserved for future use
133    Reserved49 = 49,
134    /// Reserved for future use
135    Reserved50 = 50,
136    /// Reserved for future use
137    Reserved51 = 51,
138    /// Reserved for future use
139    Reserved52 = 52,
140    /// Reserved for future use
141    Reserved53 = 53,
142    /// Reserved for future use
143    Reserved54 = 54,
144    /// Reserved for future use
145    Reserved55 = 55,
146    /// Reserved for future use
147    Reserved56 = 56,
148    /// Reserved for future use
149    Reserved57 = 57,
150    /// Reserved for future use
151    Reserved58 = 58,
152    /// Reserved for future use
153    Reserved59 = 59,
154    /// Reserved for future use
155    Reserved60 = 60,
156    /// Reserved for future use
157    Reserved61 = 61,
158    /// Reserved for future use
159    Reserved62 = 62,
160    /// Reserved for future use
161    Reserved63 = 63,
162    /// Reserved for future use
163    Reserved64 = 64,
164    /// Reserved for future use
165    Reserved65 = 65,
166    /// Reserved for future use
167    Reserved66 = 66,
168    /// Reserved for future use
169    Reserved67 = 67,
170    /// Reserved for future use
171    Reserved68 = 68,
172    /// Reserved for future use
173    Reserved69 = 69,
174    /// Reserved for future use
175    Reserved70 = 70,
176    /// Reserved for future use
177    Reserved71 = 71,
178    /// Reserved for future use
179    Reserved72 = 72,
180    /// Reserved for future use
181    Reserved73 = 73,
182    /// Reserved for future use
183    Reserved74 = 74,
184    /// Reserved for future use
185    Reserved75 = 75,
186    /// Reserved for future use
187    Reserved76 = 76,
188    /// Reserved for future use
189    Reserved77 = 77,
190    /// Reserved for future use
191    Reserved78 = 78,
192    /// Reserved for future use
193    Reserved79 = 79,
194    /// Reserved for future use
195    Reserved80 = 80,
196    /// Reserved for future use
197    Reserved81 = 81,
198    /// Reserved for future use
199    Reserved82 = 82,
200    /// Reserved for future use
201    Reserved83 = 83,
202    /// Reserved for future use
203    Reserved84 = 84,
204    /// Reserved for future use
205    Reserved85 = 85,
206    /// Reserved for future use
207    Reserved86 = 86,
208    /// Reserved for future use
209    Reserved87 = 87,
210    /// Reserved for future use
211    Reserved88 = 88,
212    /// Reserved for future use
213    Reserved89 = 89,
214    /// Reserved for future use
215    Reserved90 = 90,
216    /// Reserved for future use
217    Reserved91 = 91,
218    /// Reserved for future use
219    Reserved92 = 92,
220    /// Reserved for future use
221    Reserved93 = 93,
222    /// Reserved for future use
223    Reserved94 = 94,
224    /// Reserved for future use
225    Reserved95 = 95,
226    /// Reserved for future use
227    Reserved96 = 96,
228    /// Reserved for future use
229    Reserved97 = 97,
230    /// Reserved for future use
231    Reserved98 = 98,
232    /// Reserved for future use
233    Reserved99 = 99,
234    /// Reserved for future use
235    Reserved100 = 100,
236    /// Reserved for future use
237    Reserved101 = 101,
238    /// Reserved for future use
239    Reserved102 = 102,
240    /// Reserved for future use
241    Reserved103 = 103,
242    /// Reserved for future use
243    Reserved104 = 104,
244    /// Reserved for future use
245    Reserved105 = 105,
246    /// Reserved for future use
247    Reserved106 = 106,
248    /// Reserved for future use
249    Reserved107 = 107,
250    /// Reserved for future use
251    Reserved108 = 108,
252    /// Reserved for future use
253    Reserved109 = 109,
254    /// Reserved for future use
255    Reserved110 = 110,
256    /// Reserved for future use
257    Reserved111 = 111,
258    /// Reserved for future use
259    Reserved112 = 112,
260    /// Reserved for future use
261    Reserved113 = 113,
262    /// Reserved for future use
263    Reserved114 = 114,
264    /// Reserved for future use
265    Reserved115 = 115,
266    /// Reserved for future use
267    Reserved116 = 116,
268    /// Reserved for future use
269    Reserved117 = 117,
270    /// Reserved for future use
271    Reserved118 = 118,
272    /// Reserved for future use
273    Reserved119 = 119,
274    /// Reserved for future use
275    Reserved120 = 120,
276    /// Reserved for future use
277    Reserved121 = 121,
278    /// Reserved for future use
279    Reserved122 = 122,
280    /// Reserved for future use
281    Reserved123 = 123,
282    /// Reserved for future use
283    Reserved124 = 124,
284    /// Reserved for future use
285    Reserved125 = 125,
286    /// Reserved for future use
287    Reserved126 = 126,
288    /// Reserved for future use
289    Reserved127 = 127,
290    /// Reserved for future use
291    Reserved128 = 128,
292    /// Reserved for future use
293    Reserved129 = 129,
294    /// Reserved for future use
295    Reserved130 = 130,
296    /// Reserved for future use
297    Reserved131 = 131,
298    /// Reserved for future use
299    Reserved132 = 132,
300    /// Reserved for future use
301    Reserved133 = 133,
302    /// Reserved for future use
303    Reserved134 = 134,
304    /// Reserved for future use
305    Reserved135 = 135,
306    /// Reserved for future use
307    Reserved136 = 136,
308    /// Reserved for future use
309    Reserved137 = 137,
310    /// Reserved for future use
311    Reserved138 = 138,
312    /// Reserved for future use
313    Reserved139 = 139,
314    /// Reserved for future use
315    Reserved140 = 140,
316    /// Reserved for future use
317    Reserved141 = 141,
318    /// Reserved for future use
319    Reserved142 = 142,
320    /// Reserved for future use
321    Reserved143 = 143,
322    /// Reserved for future use
323    Reserved144 = 144,
324    /// Reserved for future use
325    Reserved145 = 145,
326    /// Reserved for future use
327    Reserved146 = 146,
328    /// Reserved for future use
329    Reserved147 = 147,
330    /// Reserved for future use
331    Reserved148 = 148,
332    /// Reserved for future use
333    Reserved149 = 149,
334    /// Reserved for future use
335    Reserved150 = 150,
336    /// Reserved for future use
337    Reserved151 = 151,
338    /// Reserved for future use
339    Reserved152 = 152,
340    /// Reserved for future use
341    Reserved153 = 153,
342    /// Reserved for future use
343    Reserved154 = 154,
344    /// Reserved for future use
345    Reserved155 = 155,
346    /// Reserved for future use
347    Reserved156 = 156,
348    /// Reserved for future use
349    Reserved157 = 157,
350    /// Reserved for future use
351    Reserved158 = 158,
352    /// Reserved for future use
353    Reserved159 = 159,
354    /// Reserved for future use
355    Reserved160 = 160,
356    /// Reserved for future use
357    Reserved161 = 161,
358    /// Reserved for future use
359    Reserved162 = 162,
360    /// Reserved for future use
361    Reserved163 = 163,
362    /// Reserved for future use
363    Reserved164 = 164,
364    /// Reserved for future use
365    Reserved165 = 165,
366    /// Reserved for future use
367    Reserved166 = 166,
368    /// Reserved for future use
369    Reserved167 = 167,
370    /// Reserved for future use
371    Reserved168 = 168,
372    /// Reserved for future use
373    Reserved169 = 169,
374    /// Reserved for future use
375    Reserved170 = 170,
376    /// Reserved for future use
377    Reserved171 = 171,
378    /// Reserved for future use
379    Reserved172 = 172,
380    /// Reserved for future use
381    Reserved173 = 173,
382    /// Reserved for future use
383    Reserved174 = 174,
384    /// Reserved for future use
385    Reserved175 = 175,
386    /// Reserved for future use
387    Reserved176 = 176,
388    /// Reserved for future use
389    Reserved177 = 177,
390    /// Reserved for future use
391    Reserved178 = 178,
392    /// Reserved for future use
393    Reserved179 = 179,
394    /// Reserved for future use
395    Reserved180 = 180,
396    /// Reserved for future use
397    Reserved181 = 181,
398    /// Reserved for future use
399    Reserved182 = 182,
400    /// Reserved for future use
401    Reserved183 = 183,
402    /// Reserved for future use
403    Reserved184 = 184,
404    /// Reserved for future use
405    Reserved185 = 185,
406    /// Reserved for future use
407    Reserved186 = 186,
408    /// Reserved for future use
409    Reserved187 = 187,
410    /// Reserved for future use
411    Reserved188 = 188,
412    /// Reserved for future use
413    Reserved189 = 189,
414    /// Reserved for future use
415    Reserved190 = 190,
416    /// Reserved for future use
417    Reserved191 = 191,
418    /// Reserved for future use
419    Reserved192 = 192,
420    /// Reserved for future use
421    Reserved193 = 193,
422    /// Reserved for future use
423    Reserved194 = 194,
424    /// Reserved for future use
425    Reserved195 = 195,
426    /// Reserved for future use
427    Reserved196 = 196,
428    /// Reserved for future use
429    Reserved197 = 197,
430    /// Reserved for future use
431    Reserved198 = 198,
432    /// Reserved for future use
433    Reserved199 = 199,
434    /// Reserved for future use
435    Reserved200 = 200,
436    /// Reserved for future use
437    Reserved201 = 201,
438    /// Reserved for future use
439    Reserved202 = 202,
440    /// Reserved for future use
441    Reserved203 = 203,
442    /// Reserved for future use
443    Reserved204 = 204,
444    /// Reserved for future use
445    Reserved205 = 205,
446    /// Reserved for future use
447    Reserved206 = 206,
448    /// Reserved for future use
449    Reserved207 = 207,
450    /// Reserved for future use
451    Reserved208 = 208,
452    /// Reserved for future use
453    Reserved209 = 209,
454    /// Reserved for future use
455    Reserved210 = 210,
456    /// Reserved for future use
457    Reserved211 = 211,
458    /// Reserved for future use
459    Reserved212 = 212,
460    /// Reserved for future use
461    Reserved213 = 213,
462    /// Reserved for future use
463    Reserved214 = 214,
464    /// Reserved for future use
465    Reserved215 = 215,
466    /// Reserved for future use
467    Reserved216 = 216,
468    /// Reserved for future use
469    Reserved217 = 217,
470    /// Reserved for future use
471    Reserved218 = 218,
472    /// Reserved for future use
473    Reserved219 = 219,
474    /// Reserved for future use
475    Reserved220 = 220,
476    /// Reserved for future use
477    Reserved221 = 221,
478    /// Reserved for future use
479    Reserved222 = 222,
480    /// Reserved for future use
481    Reserved223 = 223,
482    /// Reserved for future use
483    Reserved224 = 224,
484    /// Reserved for future use
485    Reserved225 = 225,
486    /// Reserved for future use
487    Reserved226 = 226,
488    /// Reserved for future use
489    Reserved227 = 227,
490    /// Reserved for future use
491    Reserved228 = 228,
492    /// Reserved for future use
493    Reserved229 = 229,
494    /// Reserved for future use
495    Reserved230 = 230,
496    /// Reserved for future use
497    Reserved231 = 231,
498    /// Reserved for future use
499    Reserved232 = 232,
500    /// Reserved for future use
501    Reserved233 = 233,
502    /// Reserved for future use
503    Reserved234 = 234,
504    /// Reserved for future use
505    Reserved235 = 235,
506    /// Reserved for future use
507    Reserved236 = 236,
508    /// Reserved for future use
509    Reserved237 = 237,
510    /// Reserved for future use
511    Reserved238 = 238,
512    /// Reserved for future use
513    Reserved239 = 239,
514    /// Reserved for future use
515    Reserved240 = 240,
516    /// Reserved for future use
517    Reserved241 = 241,
518    /// Reserved for future use
519    Reserved242 = 242,
520    /// Reserved for future use
521    Reserved243 = 243,
522    /// Reserved for future use
523    Reserved244 = 244,
524    /// Reserved for future use
525    Reserved245 = 245,
526    /// Reserved for future use
527    Reserved246 = 246,
528    /// Reserved for future use
529    Reserved247 = 247,
530    /// Reserved for future use
531    Reserved248 = 248,
532    /// Reserved for future use
533    Reserved249 = 249,
534    /// Reserved for future use
535    Reserved250 = 250,
536    /// Reserved for future use
537    Reserved251 = 251,
538    /// Reserved for future use
539    Reserved252 = 252,
540    /// Reserved for future use
541    Reserved253 = 253,
542    /// Reserved for future use
543    Reserved254 = 254,
544    /// Reserved for future use
545    Reserved255 = 255,
546}
547
548impl std::error::Error for OcallError {}
549
550pub type Result<T, E = OcallError> = core::result::Result<T, E>;
551pub trait OcallEnv {
552    fn put_return(&mut self, rv: Vec<u8>) -> usize;
553    fn take_return(&mut self) -> Option<Vec<u8>>;
554}
555
556// link to wasm module wapo.
557#[link(wasm_import_module = "wapo")]
558extern "C" {
559    fn ocall(task_id: i32, func_id: i32, p0: IntPtr, p1: IntPtr, p2: IntPtr, p3: IntPtr) -> IntRet;
560    fn ocall_fast_return(
561        task_id: i32,
562        func_id: i32,
563        p0: IntPtr,
564        p1: IntPtr,
565        p2: IntPtr,
566        p3: IntPtr,
567    ) -> IntRet;
568}
569
570unsafe fn do_ocall(func_id: i32, p0: IntPtr, p1: IntPtr, p2: IntPtr, p3: IntPtr) -> IntRet {
571    ocall(tasks::current_task(), func_id, p0, p1, p2, p3)
572}
573
574unsafe fn do_ocall_fast_return(
575    func_id: i32,
576    p0: IntPtr,
577    p1: IntPtr,
578    p2: IntPtr,
579    p3: IntPtr,
580) -> IntRet {
581    ocall_fast_return(tasks::current_task(), func_id, p0, p1, p2, p3)
582}
583
584#[derive(Default)]
585struct Buffer(TinyVec<[u8; 128]>);
586
587impl Deref for Buffer {
588    type Target = TinyVec<[u8; 128]>;
589
590    fn deref(&self) -> &Self::Target {
591        &self.0
592    }
593}
594
595impl DerefMut for Buffer {
596    fn deref_mut(&mut self) -> &mut Self::Target {
597        &mut self.0
598    }
599}
600
601impl scale::Output for Buffer {
602    fn write(&mut self, bytes: &[u8]) {
603        self.0.extend_from_slice(bytes)
604    }
605}
606
607impl AsRef<[u8]> for Buffer {
608    fn as_ref(&self) -> &[u8] {
609        self.0.as_ref()
610    }
611}
612
613fn alloc_buffer(size: usize) -> Buffer {
614    let mut buf = Buffer::default();
615    buf.0.resize(size, 0_u8);
616    buf
617}