use hypen_engine::Patch;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum RemoteMessage {
Hello {
#[serde(skip_serializing_if = "Option::is_none", rename = "sessionId")]
session_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
props: Option<serde_json::Value>,
},
SessionAck {
#[serde(rename = "sessionId")]
session_id: String,
#[serde(rename = "isNew")]
is_new: bool,
#[serde(rename = "isRestored")]
is_restored: bool,
},
InitialTree {
module: String,
state: serde_json::Value,
patches: Vec<Patch>,
revision: u64,
},
Patch {
module: String,
patches: Vec<Patch>,
revision: u64,
},
StateUpdate {
module: String,
state: serde_json::Value,
revision: u64,
},
DispatchAction {
#[serde(default)]
module: String,
action: String,
#[serde(skip_serializing_if = "Option::is_none")]
payload: Option<serde_json::Value>,
},
SubscribeState { module: String },
SessionExpired {
#[serde(rename = "sessionId")]
session_id: String,
reason: String,
},
}
impl RemoteMessage {
pub fn to_json(&self) -> Result<String, serde_json::Error> {
serde_json::to_string(self)
}
pub fn from_json(json: &str) -> Result<Self, serde_json::Error> {
serde_json::from_str(json)
}
}