use serde::{Deserialize, Serialize};
use crate::event::PROTOCOL_VERSION;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerMessage {
pub v: u8,
#[serde(flatten)]
pub payload: ServerPayload,
}
impl ServerMessage {
pub fn new(payload: ServerPayload) -> Self {
Self {
v: PROTOCOL_VERSION,
payload,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum ServerPayload {
#[serde(rename = "patch")]
Patch(PatchMessage),
#[serde(rename = "error")]
Error(ErrorMessage),
#[serde(rename = "redirect")]
Redirect(RedirectMessage),
#[serde(rename = "heartbeat_ack")]
HeartbeatAck(HeartbeatAck),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PatchMessage {
pub seq: u64,
pub ops: Vec<PatchOp>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "op")]
pub enum PatchOp {
#[serde(rename = "replace_text")]
ReplaceText { target: String, value: String },
#[serde(rename = "replace_html")]
ReplaceHtml { target: String, html: String },
#[serde(rename = "set_attr")]
SetAttr {
target: String,
name: String,
value: String,
},
#[serde(rename = "remove_attr")]
RemoveAttr { target: String, name: String },
#[serde(rename = "add_class")]
AddClass { target: String, class: String },
#[serde(rename = "remove_class")]
RemoveClass { target: String, class: String },
#[serde(rename = "insert_before")]
InsertBefore { target: String, html: String },
#[serde(rename = "insert_after")]
InsertAfter { target: String, html: String },
#[serde(rename = "remove_node")]
RemoveNode { target: String },
#[serde(rename = "focus")]
Focus { target: String },
#[serde(rename = "scroll_to")]
ScrollTo { target: String },
#[serde(rename = "redirect")]
Redirect { url: String },
#[serde(rename = "flash")]
Flash { level: FlashLevel, message: String },
#[serde(rename = "modal_open")]
ModalOpen { id: String, html: String },
#[serde(rename = "modal_close")]
ModalClose { id: String },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum FlashLevel {
Success,
Info,
Warning,
Danger,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ErrorMessage {
pub seq: Option<u64>,
pub code: String,
pub message: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RedirectMessage {
pub url: String,
pub flash: Option<(FlashLevel, String)>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HeartbeatAck {
pub seq: u64,
}