use serde::{Deserialize, Serialize}; #[derive(Clone, Serialize, Deserialize)] pub struct Viewer { #[serde(default, skip_serializing_if = "Option::is_none")] pub nickname: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub colour: Option, } #[derive(Clone, Serialize, Deserialize)] #[serde(tag = "op", content = "data")] pub enum WatchEventData { SetPlaying { playing: bool, time: u64, }, SetTime { #[serde(default, skip_serializing_if = "Option::is_none")] from: Option, to: u64, }, UserJoin, UserLeave, ChatMessage(String), Ping(String), UpdateViewerList(Vec), } #[derive(Clone, Serialize, Deserialize)] pub struct WatchEvent { #[serde(default, skip_serializing_if = "Option::is_none")] pub user: Option, #[serde(default, skip_serializing_if = "Option::is_none")] pub colour: Option, #[serde(flatten)] pub data: WatchEventData, #[serde(default)] pub reflected: bool, } impl WatchEvent { pub fn new(user: String, colour: String, data: WatchEventData) -> Self { WatchEvent { user: Some(user), colour: Some(colour), data, reflected: false, } } }