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}