use cow_sdk_core::{Address, HexData};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct HookList {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub pre: Vec<Hook>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub post: Vec<Hook>,
}
impl HookList {
#[must_use]
pub const fn new(pre: Vec<Hook>, post: Vec<Hook>) -> Self {
Self {
version: None,
pre,
post,
}
}
#[must_use]
pub fn with_version(mut self, version: impl Into<String>) -> Self {
self.version = Some(version.into());
self
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct Hook {
pub target: Address,
pub call_data: HexData,
#[serde(with = "alloy_serde::displayfromstr")]
pub gas_limit: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dapp_id: Option<String>,
}
impl Hook {
#[must_use]
pub const fn new(target: Address, call_data: HexData, gas_limit: u64) -> Self {
Self {
target,
call_data,
gas_limit,
dapp_id: None,
}
}
#[must_use]
pub fn with_dapp_id(mut self, dapp_id: impl Into<String>) -> Self {
self.dapp_id = Some(dapp_id.into());
self
}
}