use crate::{
activity::events as activity_events, overlay::events as overlay_events,
relations::events as relation_events, types::ErrorPayload, user::events as user_events,
};
use serde::{Deserialize, Serialize};
#[derive(Copy, Clone, Debug, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub(crate) enum EventKind {
Ready,
Error,
CurrentUserUpdate,
ActivityJoinRequest,
ActivityJoin,
ActivitySpectate,
ActivityInvite,
OverlayUpdate,
RelationshipUpdate,
}
#[derive(Deserialize, Debug)]
#[serde(tag = "evt", content = "data", rename_all = "SCREAMING_SNAKE_CASE")]
#[cfg_attr(test, derive(Serialize))]
pub enum Event {
Error(ErrorPayload),
Ready(user_events::ConnectEvent),
#[serde(skip)]
Disconnected { reason: crate::Error },
CurrentUserUpdate(user_events::UpdateEvent),
ActivityJoin(activity_events::SecretEvent),
ActivitySpectate(activity_events::SecretEvent),
ActivityJoinRequest(activity_events::JoinRequestEvent),
ActivityInvite(activity_events::InviteEvent),
OverlayUpdate(overlay_events::UpdateEvent),
RelationshipUpdate(std::sync::Arc<crate::relations::Relationship>),
}
#[derive(Deserialize, Debug)]
#[cfg_attr(test, derive(Serialize))]
pub(crate) struct EventFrame {
#[serde(flatten)]
pub(crate) inner: Event,
}
pub enum ClassifiedEvent {
User(user_events::UserEvent),
Activity(activity_events::ActivityEvent),
Overlay(overlay_events::OverlayEvent),
Relations(relation_events::RelationshipEvent),
}
impl From<Event> for ClassifiedEvent {
fn from(eve: Event) -> Self {
use activity_events::ActivityEvent as AE;
use user_events::UserEvent as UE;
match eve {
Event::Ready(ce) => Self::User(UE::Connect(ce)),
Event::Disconnected { reason } => {
Self::User(UE::Disconnect(user_events::DisconnectEvent { reason }))
}
Event::CurrentUserUpdate(user) => Self::User(UE::Update(user)),
Event::ActivityJoin(secret) => Self::Activity(AE::Join(secret)),
Event::ActivitySpectate(secret) => Self::Activity(AE::Spectate(secret)),
Event::ActivityJoinRequest(jr) => Self::Activity(AE::JoinRequest(jr)),
Event::ActivityInvite(inv) => Self::Activity(AE::Invite(inv)),
Event::OverlayUpdate(update) => {
Self::Overlay(overlay_events::OverlayEvent::Update(update))
}
Event::RelationshipUpdate(relationship) => {
Self::Relations(relation_events::RelationshipEvent::Update(relationship))
}
Event::Error(_) => unreachable!(),
}
}
}