smart_contract/lib.rs
1#![no_std]
2
3extern crate alloc;
4
5use alloc::fmt::{Debug, Formatter, Result};
6
7pub mod crypto;
8pub mod payload;
9pub mod sys;
10pub mod transaction;
11
12pub fn log(msg: &str) {
13 unsafe {
14 let msg = msg.as_bytes();
15 sys::_log(msg.as_ptr(), msg.len());
16 }
17}
18
19#[allow(dead_code)]
20#[doc(hidden)]
21pub struct WrapDebug<T>(pub T);
22
23impl<T: Debug> Debug for WrapDebug<T> {
24 fn fmt(&self, f: &mut Formatter) -> Result {
25 self.0.fmt(f)
26 }
27}
28
29#[macro_export]
30macro_rules! debug {
31 // Handle `debug!()` <-- literal
32 () => {
33 debug!( () );
34 };
35 // Handle trailing comma:
36 ($($val: expr),+,) => {
37 debug!( $($val),+ )
38 };
39 ($($lab: expr => $val: expr),+,) => {
40 debug!( $($lab => $val),+ )
41 };
42 // Without label, use source of $val:
43 ($valf: expr $(, $val: expr)*) => {{
44 // in order: for panics, clarification on: debug!(expr);, debug!(expr)
45 #[allow(unreachable_code, unused_must_use, unused_parens)]
46 let _r = {
47 {
48
49 use ::std::io::Write;
50 let mut buf = ::std::io::BufWriter::new(vec![]);
51
52 write!(&mut buf, "[{}:{}] ", file!(), line!()).unwrap();
53
54 // Foreach label and expression:
55 // 1. Evaluate each expression,
56 // 2. Print out $lab = value of expression
57 let _ret = (
58 {
59 // Evaluate, tmp is value:
60 let _tmp = $crate::WrapDebug($valf);
61 // Won't get further if $val panics.
62
63 // Print out $lab = _tmo:
64 write!(&mut buf, "{} = {:?}", stringify!($valf), _tmp).unwrap();
65
66 // Yield tmp:
67 _tmp.0
68 }
69 $(, {
70 // Comma separator:
71 write!(&mut buf, ", ").unwrap();
72
73 // Print out $lab = :
74 write!(&mut buf, "{} = ", stringify!($val)).unwrap();
75
76 // Evaluate, tmp is value:
77 let _tmp = $crate::WrapDebug($val);
78 // Won't get further if $val panics.
79
80 // Print out tmp:
81 write!(&mut buf, "{:?}" , _tmp).unwrap();
82
83 // Yield tmp:
84 _tmp.0
85 } )*
86 );
87
88 $crate::log(::std::str::from_utf8(&buf.into_inner().unwrap()).unwrap());
89
90 // Return the expression:
91 _ret
92 }
93 };
94 _r
95 }};
96 // With label:
97 ($labf: expr => $valf: expr $(, $lab: expr => $val: expr)*) => {{
98 // in order: for panics, clarification on: debug!(expr);, debug!(expr)
99 #[allow(unreachable_code, unused_must_use, unused_parens)]
100 let _r = {
101 {
102 use ::std::io::Write;
103 let mut buf = ::std::io::BufWriter::new(vec![]);
104
105 write!(&mut buf, "[{}:{}] ", file!(), line!());
106
107 // Foreach label and expression:
108 // 1. Evaluate each expression,
109 // 2. Print out $lab = value of expression
110 let _ret = (
111 {
112 // Enforce is_literal_string($lab):
113 let _ = concat!($labf, "");
114 let _ : &'static str = $labf;
115
116 // Print out $lab = :
117 write!(&mut buf, "{} = ", stringify!($labf)).unwrap();
118
119 // Evaluate, tmp is value:
120 let _tmp = $crate::WrapDebug($valf);
121 // Won't get further if $val panics.
122
123 // Print out tmp:
124 write!(&mut buf, "{:?}" , _tmp).unwrap();
125
126 // Yield tmp:
127 _tmp.0
128 }
129 $(, {
130 // Comma separator:
131 write!(&mut buf, ", ").unwrap();
132
133 // Enforce is_literal_string($lab):
134 let _ = concat!($lab, "");
135 let _ : &'static str = $lab;
136
137 // Print out $lab = :
138 write!(&mut buf, "{} = ", stringify!($lab)).unwrap();
139
140 // Evaluate, tmp is value:
141 let _tmp = $crate::WrapDebug($val);
142 // Won't get further if $val panics.
143
144 // Print out tmp:
145 write!(&mut buf, "{:?}" , _tmp).unwrap();
146
147 // Yield tmp:
148 _tmp.0
149 } )*
150 );
151
152 $crate::log(::std::str::from_utf8(&buf.into_inner().unwrap()).unwrap());
153
154 // Return the expression:
155 _ret
156 }
157 };
158 _r
159 }};
160}