use libipld::{Cid, DagCbor};
use lru_mem::HeapSize;
use serde::{Deserialize, Serialize};
pub enum Message {
Deliver(Mail),
Reply(Reply),
}
#[derive(Debug, DagCbor, Clone, Serialize, Deserialize)]
pub struct Reply {
pub cid: Cid,
pub send_uid: u64,
pub status: Status,
}
#[derive(Debug, DagCbor, Clone, Serialize, Deserialize)]
pub enum Status {
Success,
Blacklist,
}
#[derive(Debug, DagCbor, Clone, Serialize, Deserialize)]
pub struct Mail {
pub cid: Cid,
pub sender_uid: u64,
pub routing_uids: Vec<u64>,
pub receiver_uid: u64,
pub root_content: MailContent,
}
#[derive(Debug, DagCbor, Clone, Serialize, Deserialize)]
pub struct MailContent {
pub length: u64,
pub content: ContentType,
}
impl HeapSize for MailContent {
fn heap_size(&self) -> usize {
match &self.content {
ContentType::Mixed(cids) => cids.len() * 64 + 8,
ContentType::Related(cids) => cids.len() * 64 + 8,
ContentType::Alternative(_, _) => 2 * 64 + 8,
ContentType::Blocks(cids) => cids.len() * 64 + 8,
ContentType::Mime(name, data) => data.len() + name.len() + 8,
}
}
}
#[derive(Debug, DagCbor, Clone, Serialize, Deserialize)]
pub enum ContentType {
Mixed(Vec<Cid>),
Related(Vec<Cid>),
Alternative(Cid, Cid),
Blocks(Vec<Cid>),
Mime(String, Vec<u8>),
}