Skip to main content

agent_protocols/mail/
types.rs

1use crate::identity::{AgentId, Envelope};
2use serde::{Deserialize, Serialize};
3use serde_json::Value;
4
5pub type MailboxCard = Envelope<MailboxCardPayload>;
6pub type Letter = Envelope<Value>;
7#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
8#[serde(deny_unknown_fields)]
9pub struct MailboxCardPayload {
10    pub mailbox_id: String,
11    pub expires_at: i64,
12    pub receive_until: i64,
13    pub public_key: String,
14    /// Zero to eight relay origins; an empty list closes the mailbox.
15    pub routes: Vec<String>,
16    pub max_packet_bytes: usize,
17}
18#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
19#[serde(deny_unknown_fields)]
20pub struct MessagePayload {
21    pub to: AgentId,
22    pub expires_at: i64,
23    pub thread_id: String,
24    pub parts: Vec<MailPart>,
25    #[serde(default, skip_serializing_if = "Option::is_none")]
26    pub subject: Option<String>,
27    #[serde(default, skip_serializing_if = "Option::is_none")]
28    pub in_reply_to: Option<String>,
29    #[serde(default, skip_serializing_if = "Option::is_none")]
30    pub reply_card: Option<Value>,
31}
32#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
33#[serde(deny_unknown_fields)]
34pub struct MailPart {
35    pub media_type: String,
36    pub data: String,
37    #[serde(default, skip_serializing_if = "Option::is_none")]
38    pub name: Option<String>,
39}
40impl MailPart {
41    pub fn text(text: &str) -> Self {
42        Self {
43            media_type: "text/plain".into(),
44            data: super::encode_bytes(text.as_bytes()),
45            name: None,
46        }
47    }
48    pub fn bytes(media_type: impl Into<String>, bytes: &[u8], name: Option<String>) -> Self {
49        Self {
50            media_type: media_type.into(),
51            data: super::encode_bytes(bytes),
52            name,
53        }
54    }
55}
56#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
57#[serde(deny_unknown_fields)]
58pub struct PacketHeader {
59    pub protocol: String,
60    pub mailbox_id: String,
61    pub card_hash: String,
62    pub expires_at: i64,
63}
64#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
65#[serde(deny_unknown_fields)]
66pub struct Packet {
67    pub header: PacketHeader,
68    pub enc: String,
69    pub ciphertext: String,
70}
71/// Anonymous delivery result. It never carries the mailbox `seq`.
72#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
73#[serde(deny_unknown_fields)]
74pub struct DeliveryResult {
75    pub packet_id: String,
76    pub accepted_at: i64,
77}
78#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
79#[serde(deny_unknown_fields)]
80pub struct PacketRecord {
81    pub packet_id: String,
82    pub packet: Packet,
83    pub accepted_at: i64,
84    pub seq: u64,
85}
86/// A parsed mailbox address (Mail Section 3.3). `routes` is empty for the stable form.
87#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
88#[serde(deny_unknown_fields)]
89pub struct MailAddress {
90    pub owner: AgentId,
91    pub mailbox_id: String,
92    pub routes: Vec<String>,
93}
94#[derive(Clone, Debug, PartialEq)]
95pub enum InboxAcceptance {
96    Accepted(Box<Letter>),
97    Duplicate(Box<Letter>),
98}