use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::identity::{ChannelUser, ConversationId};
use crate::message::{ChannelMessage, MessageId, ThreadId};
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
pub enum ChannelEvent {
MessageReceived(ChannelMessage),
MessageEdited(ChannelMessage),
MessageDeleted {
message_id: MessageId,
conversation: ConversationId,
},
ReactionAdded {
message_id: MessageId,
user: ChannelUser,
emoji: String,
},
ReactionRemoved {
message_id: MessageId,
user: ChannelUser,
emoji: String,
},
TypingStarted {
conversation: ConversationId,
user: ChannelUser,
},
PresenceChanged {
user: ChannelUser,
status: PresenceStatus,
},
ThreadCreated {
parent_message_id: MessageId,
thread_id: ThreadId,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, JsonSchema)]
pub enum PresenceStatus {
Online,
Away,
DoNotDisturb,
Offline,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::identity::ConversationId;
use crate::message::MessageId;
#[test]
fn channel_event_serde_roundtrip() {
let event = ChannelEvent::MessageDeleted {
message_id: MessageId::new("msg-123"),
conversation: ConversationId {
platform: "discord".to_string(),
channel_id: "general".to_string(),
server_id: None,
},
};
let json = serde_json::to_string(&event).unwrap();
let deserialized: ChannelEvent = serde_json::from_str(&json).unwrap();
match deserialized {
ChannelEvent::MessageDeleted {
message_id,
conversation,
} => {
assert_eq!(message_id, MessageId::new("msg-123"));
assert_eq!(conversation.channel_id, "general");
}
_ => panic!("expected MessageDeleted variant"),
}
}
#[test]
fn presence_status_serde_roundtrip() {
let status = PresenceStatus::DoNotDisturb;
let json = serde_json::to_string(&status).unwrap();
let deserialized: PresenceStatus = serde_json::from_str(&json).unwrap();
assert_eq!(deserialized, status);
}
}