aboutsummaryrefslogtreecommitdiffstats
path: root/filamento/src/chat.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--filamento/src/chat.rs46
1 files changed, 42 insertions, 4 deletions
diff --git a/filamento/src/chat.rs b/filamento/src/chat.rs
index 557b42b..936613e 100644
--- a/filamento/src/chat.rs
+++ b/filamento/src/chat.rs
@@ -1,8 +1,13 @@
use chrono::{DateTime, Utc};
use jid::JID;
+use rusqlite::{
+ types::{FromSql, ToSqlOutput, Value},
+ ToSql,
+};
use uuid::Uuid;
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct Message {
pub id: Uuid,
// does not contain full user information
@@ -16,7 +21,8 @@ pub struct Message {
pub body: Body,
}
-#[derive(Debug, Clone, Copy)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub enum Delivery {
Sending,
Written,
@@ -27,19 +33,51 @@ pub enum Delivery {
Queued,
}
+impl ToSql for Delivery {
+ fn to_sql(&self) -> rusqlite::Result<rusqlite::types::ToSqlOutput<'_>> {
+ Ok(match self {
+ Delivery::Sending => ToSqlOutput::Owned(Value::Text("sending".to_string())),
+ Delivery::Written => ToSqlOutput::Owned(Value::Text("written".to_string())),
+ Delivery::Sent => ToSqlOutput::Owned(Value::Text("sent".to_string())),
+ Delivery::Delivered => ToSqlOutput::Owned(Value::Text("delivered".to_string())),
+ Delivery::Read => ToSqlOutput::Owned(Value::Text("read".to_string())),
+ Delivery::Failed => ToSqlOutput::Owned(Value::Text("failed".to_string())),
+ Delivery::Queued => ToSqlOutput::Owned(Value::Text("queued".to_string())),
+ })
+ }
+}
+
+impl FromSql for Delivery {
+ fn column_result(value: rusqlite::types::ValueRef<'_>) -> rusqlite::types::FromSqlResult<Self> {
+ Ok(match value.as_str()? {
+ "sending" => Self::Sending,
+ "written" => Self::Written,
+ "sent" => Self::Sent,
+ "delivered" => Self::Delivered,
+ "read" => Self::Read,
+ "failed" => Self::Failed,
+ "queued" => Self::Queued,
+ // TODO: don't have these lol
+ value => panic!("unexpected subscription `{value}`"),
+ })
+ }
+}
+
// TODO: user migrations
// pub enum Migrated {
// Jabber(User),
// Outside,
// }
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct Body {
// TODO: rich text, other contents, threads
pub body: String,
}
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, PartialEq, Eq)]
+#[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
pub struct Chat {
pub correspondent: JID,
pub have_chatted: bool,