use serde::{Deserialize, Serialize}; use serde_repr::*; use tokio_tungstenite::tungstenite::Message as TokioMessage; #[derive(Serialize, Deserialize, Debug, Clone, Default)] pub struct WebSocketRawMessage { pub channel: WSChannel, pub data: Vec, } impl WebSocketRawMessage { pub fn to_bytes(&self) -> Vec { serde_json::to_vec(&self).unwrap_or_default() } pub fn from_bytes>(bytes: T) -> Self { serde_json::from_slice(bytes.as_ref()).unwrap_or_default() } } // The lib-ws crate should not contain business logic.So WSChannel should be removed into another place. #[derive(Serialize_repr, Deserialize_repr, Debug, Clone, Eq, PartialEq, Hash)] #[repr(u8)] #[derive(Default)] pub enum WSChannel { #[default] Document = 0, Folder = 1, Database = 2, } impl ToString for WSChannel { fn to_string(&self) -> String { match self { WSChannel::Document => "0".to_string(), WSChannel::Folder => "1".to_string(), WSChannel::Database => "2".to_string(), } } } impl std::convert::From for TokioMessage { fn from(msg: WebSocketRawMessage) -> Self { TokioMessage::Binary(msg.to_bytes()) } }