ldp_protocol/types/
messages.rs1use crate::types::error::LdpError;
7use crate::types::payload::PayloadMode;
8use crate::types::provenance::Provenance;
9use serde::{Deserialize, Serialize};
10use serde_json::Value;
11
12#[derive(Debug, Clone, Serialize, Deserialize)]
14pub struct LdpEnvelope {
15 pub message_id: String,
17
18 pub session_id: String,
20
21 pub from: String,
23
24 pub to: String,
26
27 pub body: LdpMessageBody,
29
30 pub payload_mode: PayloadMode,
32
33 pub timestamp: String,
35
36 pub provenance: Option<Provenance>,
38
39 #[serde(skip_serializing_if = "Option::is_none")]
41 pub signature: Option<String>,
42
43 #[serde(skip_serializing_if = "Option::is_none")]
45 pub signature_algorithm: Option<String>,
46}
47
48#[derive(Debug, Clone, Serialize, Deserialize)]
53#[serde(tag = "type", rename_all = "SCREAMING_SNAKE_CASE")]
54pub enum LdpMessageBody {
55 Hello {
57 delegate_id: String,
58 supported_modes: Vec<PayloadMode>,
59 },
60
61 CapabilityManifest { capabilities: Value },
63
64 SessionPropose { config: Value },
66
67 SessionAccept {
69 session_id: String,
70 negotiated_mode: PayloadMode,
71 },
72
73 SessionReject {
75 reason: String,
76 #[serde(skip_serializing_if = "Option::is_none")]
77 error: Option<LdpError>,
78 },
79
80 TaskSubmit {
82 task_id: String,
83 skill: String,
84 input: Value,
85 },
86
87 TaskUpdate {
89 task_id: String,
90 progress: Option<f32>,
91 message: Option<String>,
92 },
93
94 TaskResult {
96 task_id: String,
97 output: Value,
98 provenance: Provenance,
99 },
100
101 TaskFailed { task_id: String, error: LdpError },
103
104 TaskCancel { task_id: String },
106
107 Attestation { claim: Value, evidence: Value },
109
110 SessionClose { reason: Option<String> },
112}
113
114impl LdpEnvelope {
115 pub fn new(
117 session_id: impl Into<String>,
118 from: impl Into<String>,
119 to: impl Into<String>,
120 body: LdpMessageBody,
121 payload_mode: PayloadMode,
122 ) -> Self {
123 Self {
124 message_id: uuid::Uuid::new_v4().to_string(),
125 session_id: session_id.into(),
126 from: from.into(),
127 to: to.into(),
128 body,
129 payload_mode,
130 timestamp: chrono::Utc::now().to_rfc3339(),
131 provenance: None,
132 signature: None,
133 signature_algorithm: None,
134 }
135 }
136}