supercode_interchange/orchestration/
obligation.rs1use schemars::JsonSchema;
4use serde::{Deserialize, Serialize};
5use serde_json::Value;
6
7use crate::ontology::{Residue, SurfaceKey};
8
9#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
11pub struct Attachment {
12 pub kind: String,
14 #[serde(default, skip_serializing_if = "Option::is_none")]
16 pub name: Option<String>,
17 #[serde(default, skip_serializing_if = "Option::is_none")]
19 pub mime: Option<String>,
20 #[serde(default, skip_serializing_if = "Option::is_none")]
22 pub size: Option<u64>,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
25 pub url: Option<String>,
26 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub path: Option<String>,
29 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub r#ref: Option<Value>,
32}
33
34#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
36pub struct OutboundContent {
37 pub text: String,
39 #[serde(default, skip_serializing_if = "Option::is_none")]
41 pub attachments: Option<Vec<Attachment>>,
42 #[serde(default, skip_serializing_if = "Option::is_none")]
44 pub reply_to: Option<String>,
45 #[serde(default, skip_serializing_if = "Option::is_none")]
47 pub format: Option<String>,
48}
49
50#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
52#[serde(rename_all = "snake_case")]
53pub enum ObligationState {
54 Pending,
56 Sent,
58 Failed,
60 Dropped,
62}
63
64impl ObligationState {
65 pub fn hermes_word(self) -> &'static str {
67 match self {
68 Self::Pending => "pending",
69 Self::Sent => "delivered",
70 Self::Failed => "failed",
71 Self::Dropped => "dropped",
72 }
73 }
74
75 pub fn from_hermes_word(word: &str) -> Option<Self> {
77 Some(match word {
78 "pending" => Self::Pending,
79 "delivered" | "sent" => Self::Sent,
80 "failed" => Self::Failed,
81 "dropped" => Self::Dropped,
82 _ => return None,
83 })
84 }
85}
86
87#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
89pub struct Posted {
90 pub message_id: String,
92}
93
94#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
96#[serde(tag = "kind", rename_all = "snake_case")]
97pub enum ObligationSource {
98 Turn {
100 #[serde(default, skip_serializing_if = "Option::is_none")]
102 key: Option<SurfaceKey>,
103 },
104 Fire {
106 fire_id: String,
108 },
109 Webhook {
111 name: String,
113 },
114}
115
116#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
118pub struct Obligation {
119 pub id: String,
121 pub target: SurfaceKey,
123 #[serde(default)]
125 pub session_key: Option<String>,
126 pub content: OutboundContent,
128 pub state: ObligationState,
130 #[serde(default)]
132 pub attempts: u64,
133 #[serde(default)]
135 pub last_error: Option<String>,
136 pub created_at: String,
138 pub updated_at: String,
140 #[serde(default)]
142 pub delivered_at: Option<String>,
143 #[serde(default, skip_serializing_if = "Option::is_none")]
145 pub posted: Option<Posted>,
146 pub source: ObligationSource,
148 #[serde(default)]
150 pub residue: Residue,
151}