use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum DescriptorContext {
Contract(ContractContext),
Eip712(Eip712Context),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContractContext {
#[serde(rename = "$id")]
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub contract: ContractInfo,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContractInfo {
#[serde(default)]
pub deployments: Vec<Deployment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub factory: Option<FactoryInfo>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FactoryInfo {
#[serde(rename = "deployEvent")]
#[serde(skip_serializing_if = "Option::is_none")]
pub deploy_event: Option<String>,
#[serde(default)]
pub deployments: Vec<Deployment>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Eip712Context {
#[serde(rename = "$id")]
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub eip712: Eip712Info,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Eip712Info {
#[serde(default)]
pub deployments: Vec<Deployment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<Eip712Domain>,
#[serde(rename = "domainSeparator")]
#[serde(skip_serializing_if = "Option::is_none")]
pub domain_separator: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Eip712Domain {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub version: Option<String>,
#[serde(rename = "chainId")]
#[serde(skip_serializing_if = "Option::is_none")]
pub chain_id: Option<u64>,
#[serde(rename = "verifyingContract")]
#[serde(skip_serializing_if = "Option::is_none")]
pub verifying_contract: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub salt: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Deployment {
#[serde(rename = "chainId")]
pub chain_id: u64,
pub address: String,
}
impl DescriptorContext {
pub fn deployments(&self) -> &[Deployment] {
match self {
DescriptorContext::Contract(c) => &c.contract.deployments,
DescriptorContext::Eip712(e) => &e.eip712.deployments,
}
}
}