xrpl_wasm_stdlib/host/
assert.rs1use crate::host::trace::{DataRepr, trace_data, trace_num};
7
8pub trait NumericTrace {
10 fn trace_as_num(msg: &str, value: &Self);
11}
12
13pub fn trace_value<T>(msg: &str, value: &T) {
19 let data_ptr = value as *const T as *const u8;
21 let data_len = core::mem::size_of::<T>();
22 let data_slice = unsafe { core::slice::from_raw_parts(data_ptr, data_len) };
23 let _ = trace_data(msg, data_slice, DataRepr::AsHex);
24}
25
26pub fn trace_numeric_value<T: NumericTrace>(msg: &str, value: &T) {
31 NumericTrace::trace_as_num(msg, value);
32}
33
34macro_rules! impl_numeric_trace {
36 ($($t:ty),*) => {
37 $(
38 impl NumericTrace for $t {
39 #[inline]
40 fn trace_as_num(msg: &str, value: &$t) {
41 let _ = trace_num(msg, *value as i64);
42 }
43 }
44 )*
45 }
46}
47
48impl_numeric_trace!(i8, i16, i32, i64, u8, u16, u32, u64);
50
51#[macro_export]
66macro_rules! assert_eq {
67 ($left:expr, $right:expr) => {
68 {
69 let left_val = $left;
70 let right_val = $right;
71 if left_val != right_val {
72 let _ = $crate::host::trace::trace(concat!("Assertion failed: ", stringify!($left), " != ", stringify!($right)));
73 $crate::host::assert::trace_value(" left: ", &left_val);
74 $crate::host::assert::trace_value(" right: ", &right_val);
75 panic!("assertion failed: {} != {}", stringify!($left), stringify!($right));
76 }
77 }
78 };
79 ($left:expr, $right:expr, $($arg:tt)+) => {
80 {
81 let left_val = $left;
82 let right_val = $right;
83 if left_val != right_val {
84 let _ = $crate::host::trace::trace(concat!("Assertion failed: ", stringify!($left), " != ", stringify!($right)));
85 $crate::host::assert::trace_value(" left: ", &left_val);
86 $crate::host::assert::trace_value(" right: ", &right_val);
87 let _ = $crate::host::trace::trace(" message: (see panic message for details)");
88 panic!("assertion failed: {} != {}: {}", stringify!($left), stringify!($right), format_args!($($arg)+));
89 }
90 }
91 };
92}
93
94#[macro_export]
109macro_rules! assert {
110 ($cond:expr) => {
111 if !$cond {
112 let _ = $crate::host::trace::trace(concat!("Assertion failed: ", stringify!($cond)));
113 panic!("assertion failed: {}", stringify!($cond));
114 }
115 };
116 ($cond:expr, $($arg:tt)+) => {
117 if !$cond {
118 let _ = $crate::host::trace::trace(concat!("Assertion failed: ", stringify!($cond)));
119 let _ = $crate::host::trace::trace(" message: (see panic message for details)");
120 panic!("assertion failed: {}: {}", stringify!($cond), format_args!($($arg)+));
121 }
122 };
123}
124
125#[macro_export]
140macro_rules! assert_ne {
141 ($left:expr, $right:expr) => {
142 {
143 let left_val = $left;
144 let right_val = $right;
145 if left_val == right_val {
146 let _ = $crate::host::trace::trace(concat!("Assertion failed: ", stringify!($left), " == ", stringify!($right)));
147 $crate::host::assert::trace_value(" value: ", &left_val);
148 panic!("assertion failed: {} == {}", stringify!($left), stringify!($right));
149 }
150 }
151 };
152 ($left:expr, $right:expr, $($arg:tt)+) => {
153 {
154 let left_val = $left;
155 let right_val = $right;
156 if left_val == right_val {
157 let _ = $crate::host::trace::trace(concat!("Assertion failed: ", stringify!($left), " == ", stringify!($right)));
158 $crate::host::assert::trace_value(" value: ", &left_val);
159 let _ = $crate::host::trace::trace(" message: (see panic message for details)");
160 panic!("assertion failed: {} == {}: {}", stringify!($left), stringify!($right), format_args!($($arg)+));
161 }
162 }
163 };
164
165}