use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::ontology::{Residue, SurfaceKey};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Attachment {
pub kind: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub mime: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub size: Option<u64>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub url: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub r#ref: Option<Value>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct OutboundContent {
pub text: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub attachments: Option<Vec<Attachment>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reply_to: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ObligationState {
Pending,
Sent,
Failed,
Dropped,
}
impl ObligationState {
pub fn hermes_word(self) -> &'static str {
match self {
Self::Pending => "pending",
Self::Sent => "delivered",
Self::Failed => "failed",
Self::Dropped => "dropped",
}
}
pub fn from_hermes_word(word: &str) -> Option<Self> {
Some(match word {
"pending" => Self::Pending,
"delivered" | "sent" => Self::Sent,
"failed" => Self::Failed,
"dropped" => Self::Dropped,
_ => return None,
})
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Posted {
pub message_id: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum ObligationSource {
Turn {
#[serde(default, skip_serializing_if = "Option::is_none")]
key: Option<SurfaceKey>,
},
Fire {
fire_id: String,
},
Webhook {
name: String,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub struct Obligation {
pub id: String,
pub target: SurfaceKey,
#[serde(default)]
pub session_key: Option<String>,
pub content: OutboundContent,
pub state: ObligationState,
#[serde(default)]
pub attempts: u64,
#[serde(default)]
pub last_error: Option<String>,
pub created_at: String,
pub updated_at: String,
#[serde(default)]
pub delivered_at: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub posted: Option<Posted>,
pub source: ObligationSource,
#[serde(default)]
pub residue: Residue,
}