2020-03-19 01:37:10 +01:00
|
|
|
use crate::log_fatal;
|
2020-03-25 22:50:32 +01:00
|
|
|
use crate::messages::Event;
|
2020-03-19 01:37:10 +01:00
|
|
|
use serde_json::Value;
|
|
|
|
use std::{collections::HashSet, string::String};
|
|
|
|
use strum_macros::Display;
|
|
|
|
|
|
|
|
#[derive(Debug, Display, Clone)]
|
|
|
|
pub enum Message {
|
|
|
|
Update(Status),
|
|
|
|
Conversation(Value),
|
|
|
|
Notification(Value),
|
|
|
|
Delete(String),
|
|
|
|
FiltersChanged,
|
2020-03-19 18:20:48 +01:00
|
|
|
Announcement(AnnouncementType),
|
|
|
|
UnknownEvent(String, Value),
|
2020-03-19 01:37:10 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub struct Status(Value);
|
|
|
|
|
2020-03-19 18:20:48 +01:00
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum AnnouncementType {
|
|
|
|
New(Value),
|
|
|
|
Delete(String),
|
|
|
|
Reaction(Value),
|
|
|
|
}
|
|
|
|
|
2020-03-19 01:37:10 +01:00
|
|
|
impl Message {
|
2020-03-25 22:50:32 +01:00
|
|
|
// pub fn from_json(event: Event) -> Self {
|
|
|
|
// use AnnouncementType::*;
|
|
|
|
|
|
|
|
// match event.event.as_ref() {
|
|
|
|
// "update" => Self::Update(Status(event.payload)),
|
|
|
|
// "conversation" => Self::Conversation(event.payload),
|
|
|
|
// "notification" => Self::Notification(event.payload),
|
|
|
|
// "delete" => Self::Delete(
|
|
|
|
// event
|
|
|
|
// .payload
|
|
|
|
// .as_str()
|
|
|
|
// .unwrap_or_else(|| log_fatal!("Could not process `payload` in {:?}", event))
|
|
|
|
// .to_string(),
|
|
|
|
// ),
|
|
|
|
// "filters_changed" => Self::FiltersChanged,
|
|
|
|
// "announcement" => Self::Announcement(New(event.payload)),
|
|
|
|
// "announcement.reaction" => Self::Announcement(Reaction(event.payload)),
|
|
|
|
// "announcement.delete" => Self::Announcement(Delete(
|
|
|
|
// event
|
|
|
|
// .payload
|
|
|
|
// .as_str()
|
|
|
|
// .unwrap_or_else(|| log_fatal!("Could not process `payload` in {:?}", event))
|
|
|
|
// .to_string(),
|
|
|
|
// )),
|
|
|
|
// other => {
|
|
|
|
// log::warn!("Received unexpected `event` from Redis: {}", other);
|
|
|
|
// Self::UnknownEvent(event.event.to_string(), event.payload)
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
// }
|
2020-03-19 01:37:10 +01:00
|
|
|
pub fn event(&self) -> String {
|
2020-03-19 18:20:48 +01:00
|
|
|
use AnnouncementType::*;
|
|
|
|
match self {
|
|
|
|
Self::Update(_) => "update",
|
|
|
|
Self::Conversation(_) => "conversation",
|
|
|
|
Self::Notification(_) => "notification",
|
|
|
|
Self::Announcement(New(_)) => "announcement",
|
|
|
|
Self::Announcement(Reaction(_)) => "announcement.reaction",
|
|
|
|
Self::UnknownEvent(event, _) => &event,
|
|
|
|
Self::Delete(_) => "delete",
|
|
|
|
Self::Announcement(Delete(_)) => "announcement.delete",
|
|
|
|
Self::FiltersChanged => "filters_changed",
|
|
|
|
}
|
|
|
|
.to_string()
|
2020-03-19 01:37:10 +01:00
|
|
|
}
|
|
|
|
pub fn payload(&self) -> String {
|
2020-03-19 18:20:48 +01:00
|
|
|
use AnnouncementType::*;
|
2020-03-19 01:37:10 +01:00
|
|
|
match self {
|
|
|
|
Self::Update(status) => status.0.to_string(),
|
2020-03-19 18:20:48 +01:00
|
|
|
Self::Conversation(value)
|
|
|
|
| Self::Notification(value)
|
|
|
|
| Self::Announcement(New(value))
|
|
|
|
| Self::Announcement(Reaction(value))
|
|
|
|
| Self::UnknownEvent(_, value) => value.to_string(),
|
|
|
|
Self::Delete(id) | Self::Announcement(Delete(id)) => id.clone(),
|
2020-03-19 01:37:10 +01:00
|
|
|
Self::FiltersChanged => "".to_string(),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|