use crate::types::contract::DelegationContract;
use crate::types::error::LdpError;
use crate::types::payload::PayloadMode;
use crate::types::provenance::Provenance;
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LdpEnvelope {
pub message_id: String,
pub session_id: String,
pub from: String,
pub to: String,
pub body: LdpMessageBody,
pub payload_mode: PayloadMode,
pub timestamp: String,
pub provenance: Option<Provenance>,
#[serde(skip_serializing_if = "Option::is_none")]
pub signature: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub signature_algorithm: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nonce: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "SCREAMING_SNAKE_CASE")]
pub enum LdpMessageBody {
Hello {
delegate_id: String,
supported_modes: Vec<PayloadMode>,
},
CapabilityManifest { capabilities: Value },
SessionPropose { config: Value },
SessionAccept {
session_id: String,
negotiated_mode: PayloadMode,
},
SessionReject {
reason: String,
#[serde(skip_serializing_if = "Option::is_none")]
error: Option<LdpError>,
},
TaskSubmit {
task_id: String,
skill: String,
input: Value,
#[serde(skip_serializing_if = "Option::is_none")]
contract: Option<DelegationContract>,
},
TaskUpdate {
task_id: String,
progress: Option<f32>,
message: Option<String>,
},
TaskResult {
task_id: String,
output: Value,
provenance: Provenance,
},
TaskFailed { task_id: String, error: LdpError },
TaskCancel { task_id: String },
Attestation { claim: Value, evidence: Value },
SessionClose { reason: Option<String> },
}
impl LdpEnvelope {
pub fn new(
session_id: impl Into<String>,
from: impl Into<String>,
to: impl Into<String>,
body: LdpMessageBody,
payload_mode: PayloadMode,
) -> Self {
Self {
message_id: uuid::Uuid::new_v4().to_string(),
session_id: session_id.into(),
from: from.into(),
to: to.into(),
body,
payload_mode,
timestamp: chrono::Utc::now().to_rfc3339(),
provenance: None,
signature: None,
signature_algorithm: None,
nonce: None,
}
}
}