agent_protocols/mail/
types.rs1use 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 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#[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#[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}