use serde::{Deserialize, Serialize};
use serde_hex::{Compact, SerHex};
use crate::{identifier_prefix::IdentifierPrefix, said::SelfAddressingPrefix};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(untagged)]
pub enum Seal {
Location(LocationSeal),
Event(EventSeal),
Digest(DigestSeal),
Root(RootSeal),
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct DigestSeal {
#[serde(rename = "d")]
pub dig: SelfAddressingPrefix,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct RootSeal {
#[serde(rename = "rd")]
pub tree_root: SelfAddressingPrefix,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct EventSeal {
#[serde(rename = "i")]
pub prefix: IdentifierPrefix,
#[serde(rename = "s", with = "SerHex::<Compact>")]
pub sn: u64,
pub event_digest: SelfAddressingPrefix,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct LocationSeal {
#[serde(rename = "i")]
pub prefix: IdentifierPrefix,
#[serde(rename = "s", with = "SerHex::<Compact>")]
pub sn: u64,
#[serde(rename = "t")]
pub ilk: String,
#[serde(rename = "p")]
pub prior_digest: SelfAddressingPrefix,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct DelegatingEventSeal {
#[serde(rename = "i")]
pub prefix: IdentifierPrefix,
#[serde(rename = "d")]
pub commitment: SelfAddressingPrefix,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SourceSeal {
pub sn: u64,
pub digest: SelfAddressingPrefix,
}
impl SourceSeal {
pub fn new(sn: u64, digest: SelfAddressingPrefix) -> Self {
Self { sn, digest }
}
}