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}