use serde::{Deserialize, Serialize};
use super::NodeId;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UiEvent {
pub id: NodeId,
pub kind: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub x: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub y: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_x: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub client_y: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub button: Option<u8>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scroll_top: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scroll_left: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub delta_x: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub delta_y: Option<f32>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub delta_mode: Option<String>,
}
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "t", rename_all = "camelCase")]
pub enum Outbound {
UiEvent { event: UiEvent },
ElementEvent {
id: super::NodeId,
event: String,
payload: serde_json::Value,
},
Event {
name: String,
value: serde_json::Value,
},
Response { id: u64, result: ResponseResult },
AnimationFinished {
id: crate::animations::SharedId,
token: u64,
finished: bool,
},
Reload,
}
#[derive(Debug, Clone, Serialize)]
#[serde(tag = "status", rename_all = "camelCase")]
pub enum ResponseResult {
Ok { value: serde_json::Value },
Err { message: String },
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn serializes_element_event() {
let v = serde_json::to_value(Outbound::ElementEvent {
id: 7,
event: "change".into(),
payload: serde_json::json!("hello"),
})
.expect("serializable");
assert_eq!(v["t"], "elementEvent");
assert_eq!(v["event"], "change");
assert_eq!(v["payload"], "hello");
}
#[test]
fn serializes_pointer_event_with_button() {
let ev = UiEvent {
id: 3,
kind: "pointerDown".into(),
button: Some(2),
..Default::default()
};
let v = serde_json::to_value(&ev).expect("serializable");
assert_eq!(v["kind"], "pointerDown");
assert_eq!(v["button"], 2);
}
}