1use serde::Serialize;
10
11#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
13#[serde(tag = "kind", rename_all = "snake_case")]
14pub enum Output {
15 Loaded {
17 steps: usize,
18 contracts: Vec<LoadedContract>,
20 },
21 Stop(Stop),
23 Message {
25 level: Level,
26 text: String,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 note: Option<String>,
29 },
30 Breakpoint {
32 event: BreakpointEvent,
33 id: u32,
34 label: String,
35 },
36 Breakpoints {
37 breakpoints: Vec<BreakpointInfo>,
38 },
39 Backtrace {
40 #[serde(skip_serializing_if = "Option::is_none")]
43 warning: Option<String>,
44 #[serde(skip_serializing_if = "Option::is_none")]
45 note: Option<String>,
46 frames: Vec<FrameInfo>,
47 },
48 Listing {
49 path: String,
50 current_line: u64,
51 lines: Vec<ListedLine>,
52 },
53 Stack {
54 words: Vec<String>,
56 shown: usize,
58 },
59 Memory(MemoryInfo),
60 Storage {
61 #[serde(skip_serializing_if = "Option::is_none")]
62 address: Option<String>,
63 slots: Vec<SlotInfo>,
64 },
65 Calldata {
66 bytes: usize,
67 data: String,
68 },
69 Variables {
71 #[serde(skip_serializing_if = "Option::is_none")]
72 warning: Option<String>,
73 pc: u64,
74 locals: Vec<VariableInfo>,
75 #[serde(skip_serializing_if = "Option::is_none")]
77 unavailable: Option<String>,
78 state: StateInfo,
79 },
80 Variable {
82 #[serde(skip_serializing_if = "Option::is_none")]
83 warning: Option<String>,
84 variable: VariableInfo,
85 },
86 Resources {
88 contracts: Vec<ResourceInfo>,
89 json: bool,
91 },
92 Help {
93 lines: Vec<String>,
94 },
95 Tui,
97 Quit,
99}
100
101#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
102#[serde(rename_all = "snake_case")]
103pub enum Level {
104 Info,
105 Warning,
106 Note,
108}
109
110#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
111pub struct LoadedContract {
112 pub name: String,
113 #[serde(skip_serializing_if = "Option::is_none")]
114 pub address: Option<String>,
115}
116
117#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
119#[serde(tag = "reason", rename_all = "snake_case")]
120pub enum StopReason {
121 Initial,
123 Moved,
125 Breakpoint {
126 id: u32,
127 label: String,
128 },
129 End,
131 Start,
133}
134
135#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
136pub struct Stop {
137 #[serde(flatten)]
138 pub reason: StopReason,
139 pub step: usize,
140 pub last_step: usize,
142 pub pc: u64,
143 pub op: String,
144 pub gas: u64,
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub location: Option<StopLocation>,
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub address: Option<String>,
151 pub has_source: bool,
154 #[serde(skip_serializing_if = "Option::is_none")]
156 pub stack: Option<Vec<String>>,
157 #[serde(skip_serializing_if = "Option::is_none")]
160 pub note: Option<String>,
161}
162
163#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
164pub struct StopLocation {
165 pub path: String,
166 pub line: u64,
167 #[serde(skip_serializing_if = "Option::is_none")]
168 pub function: Option<String>,
169 pub generated: bool,
171 #[serde(skip_serializing_if = "Option::is_none")]
172 pub text: Option<String>,
173}
174
175#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
176#[serde(rename_all = "snake_case")]
177pub enum BreakpointEvent {
178 Set,
179 Cleared,
180}
181
182#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
183pub struct BreakpointInfo {
184 pub id: u32,
185 pub label: String,
186}
187
188#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
189pub struct FrameInfo {
190 pub index: usize,
191 pub name: String,
193 pub arguments: Vec<ArgumentInfo>,
194 #[serde(skip_serializing_if = "Option::is_none")]
195 pub location: Option<String>,
196 #[serde(skip_serializing_if = "Option::is_none")]
198 pub address: Option<String>,
199 pub step: usize,
200 pub pc: u64,
201}
202
203#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
204pub struct ArgumentInfo {
205 pub name: String,
206 pub value: String,
207}
208
209#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
210pub struct ListedLine {
211 pub line: u64,
212 pub text: String,
213 pub current: bool,
214}
215
216#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
217pub struct MemoryInfo {
218 pub total: usize,
220 pub start: usize,
221 pub end: usize,
222 pub words: Vec<MemoryWord>,
224}
225
226#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
227pub struct MemoryWord {
228 pub offset: usize,
229 pub hex: String,
230}
231
232#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
233pub struct SlotInfo {
234 pub slot: String,
235 pub value: String,
236 #[serde(skip_serializing_if = "Option::is_none")]
238 pub was: Option<String>,
239}
240
241#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
242pub struct VariableInfo {
243 pub name: String,
244 pub ty: String,
245 pub value: String,
246 #[serde(skip_serializing_if = "Option::is_none")]
247 pub raw: Option<String>,
248 pub status: ValueStatus,
249 #[serde(skip_serializing_if = "Option::is_none")]
252 pub place: Option<String>,
253}
254
255#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
256#[serde(rename_all = "snake_case")]
257pub enum ValueStatus {
258 Decoded,
259 Raw,
260 Unavailable,
261}
262
263#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
265#[serde(tag = "status", rename_all = "snake_case")]
266pub enum StateInfo {
267 Variables {
268 variables: Vec<VariableInfo>,
269 },
270 None,
272 NoLayout,
274 NoStorage,
276}
277
278#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
279pub struct ResourceInfo {
280 pub name: String,
281 #[serde(skip_serializing_if = "Option::is_none")]
282 pub address: Option<String>,
283 pub environment: String,
284 pub sources: Vec<String>,
285}