use serde::Serialize;
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum Output {
Loaded {
steps: usize,
contracts: Vec<LoadedContract>,
},
Stop(Stop),
Message {
level: Level,
text: String,
#[serde(skip_serializing_if = "Option::is_none")]
note: Option<String>,
},
Breakpoint {
event: BreakpointEvent,
id: u32,
label: String,
},
Breakpoints {
breakpoints: Vec<BreakpointInfo>,
},
Backtrace {
#[serde(skip_serializing_if = "Option::is_none")]
warning: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
note: Option<String>,
frames: Vec<FrameInfo>,
},
Listing {
path: String,
current_line: u64,
lines: Vec<ListedLine>,
},
Stack {
words: Vec<String>,
shown: usize,
},
Memory(MemoryInfo),
Storage {
#[serde(skip_serializing_if = "Option::is_none")]
address: Option<String>,
slots: Vec<SlotInfo>,
},
TransientStorage {
#[serde(skip_serializing_if = "Option::is_none")]
address: Option<String>,
slots: Vec<SlotInfo>,
},
Calldata {
bytes: usize,
data: String,
},
ReturnData {
bytes: usize,
data: String,
},
Variables {
#[serde(skip_serializing_if = "Option::is_none")]
warning: Option<String>,
pc: u64,
locals: Vec<VariableInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
unavailable: Option<String>,
state: StateInfo,
#[serde(skip_serializing_if = "Vec::is_empty")]
transient: Vec<VariableInfo>,
},
Variable {
#[serde(skip_serializing_if = "Option::is_none")]
warning: Option<String>,
variable: VariableInfo,
},
Resources {
contracts: Vec<ResourceInfo>,
json: bool,
},
Help {
lines: Vec<String>,
},
Tui,
Quit,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum Level {
Info,
Warning,
Note,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct LoadedContract {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(tag = "reason", rename_all = "snake_case")]
pub enum StopReason {
Initial,
Moved,
Breakpoint {
id: u32,
label: String,
},
End,
Start,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct Stop {
#[serde(flatten)]
pub reason: StopReason,
pub step: usize,
pub last_step: usize,
pub pc: u64,
pub op: String,
pub gas: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub location: Option<StopLocation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
pub has_source: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub stack: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub note: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct StopLocation {
pub path: String,
pub line: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub function: Option<String>,
pub generated: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum BreakpointEvent {
Set,
Cleared,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct BreakpointInfo {
pub id: u32,
pub label: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct FrameInfo {
pub index: usize,
pub name: String,
pub arguments: Vec<ArgumentInfo>,
#[serde(skip_serializing_if = "Option::is_none")]
pub location: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
pub step: usize,
pub pc: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub kind: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct ArgumentInfo {
pub name: String,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct ListedLine {
pub line: u64,
pub text: String,
pub current: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct MemoryInfo {
pub total: usize,
pub start: usize,
pub end: usize,
pub words: Vec<MemoryWord>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct MemoryWord {
pub offset: usize,
pub hex: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct SlotInfo {
pub slot: String,
pub value: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub was: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct VariableInfo {
pub name: String,
pub ty: String,
pub value: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub raw: Option<String>,
pub status: ValueStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub place: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum ValueStatus {
Decoded,
Raw,
Unavailable,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
#[serde(tag = "status", rename_all = "snake_case")]
pub enum StateInfo {
Variables {
variables: Vec<VariableInfo>,
},
None,
NoLayout,
NoStorage,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
pub struct ResourceInfo {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<String>,
pub environment: String,
pub sources: Vec<String>,
}