use crate::models::analysis::{memory::VirtualAddress, symbols::Symbol};
use serde::{Deserialize, Serialize};
#[cfg_attr(feature = "proptest", derive(proptest_derive::Arbitrary))]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Serialize, Deserialize, Debug, Default)]
pub struct Check {
pub issue: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub details: Option<String>,
#[serde(flatten)]
pub hook: Option<Hook>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<VirtualAddress>,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "proptest", proptest(value = "None"))]
pub symbol: Option<Symbol>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub pids: Vec<u64>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub paths: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exported_path: Option<String>,
}
#[cfg_attr(feature = "proptest", derive(proptest_derive::Arbitrary))]
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(Debug, PartialEq, Eq, Serialize, Clone, Default, Deserialize)]
pub struct Hook {
pub addr: VirtualAddress,
pub hook_type: String,
pub disassembly: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub target_addr: Option<VirtualAddress>,
#[serde(skip_serializing_if = "Option::is_none")]
pub target_disassembly: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "proptest", proptest(value = "None"))]
pub target_module: Option<Symbol>,
}