use serde::{Deserialize, Serialize};
use crate::{Address, ControlFlowGraph};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct FunctionDescriptor {
pub entry: Address,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct FunctionControlFlowGraph {
pub function: FunctionDescriptor,
pub graph: ControlFlowGraph,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct FunctionSummary {
pub function: FunctionDescriptor,
pub basic_block_count: u64,
pub instruction_count: u64,
#[serde(default)]
pub callers: Vec<Address>,
#[serde(default)]
pub callees: Vec<Address>,
#[serde(default)]
pub strings: Vec<String>,
#[serde(default)]
pub constants: Vec<String>,
#[serde(default)]
pub data_refs: Vec<Address>,
#[serde(default)]
pub imports: Vec<ImportInfo>,
#[serde(default)]
pub exports: Vec<ExportInfo>,
#[serde(default)]
pub source_map: Option<SourceMapInfo>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ImportInfo {
pub name: String,
#[serde(default)]
pub library: Option<String>,
pub kind: ImportKind,
#[serde(default)]
pub address: Option<Address>,
#[serde(default)]
pub reference_types: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ImportKind {
Function,
Data,
Unknown,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct ExportInfo {
pub name: String,
pub address: Address,
pub kind: ExportKind,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ExportKind {
EntryPoint,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct SourceMapInfo {
pub file_path: String,
pub function_name: String,
#[serde(default)]
pub line_start: Option<u64>,
#[serde(default)]
pub line_end: Option<u64>,
}