use serde::{Deserialize, Serialize};
use crate::protocol::JsonMessage;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "op", rename = "subscribe", rename_all = "camelCase")]
pub struct Subscribe {
pub subscriptions: Vec<Subscription>,
}
impl Subscribe {
pub fn new(subscriptions: impl IntoIterator<Item = Subscription>) -> Self {
Self {
subscriptions: subscriptions.into_iter().collect(),
}
}
}
impl JsonMessage for Subscribe {}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Subscription {
pub id: u32,
pub channel_id: u64,
}
impl Subscription {
pub fn new(id: u32, channel_id: u64) -> Self {
Self { id, channel_id }
}
}
#[cfg(test)]
mod tests {
use crate::protocol::v1::client::ClientMessage;
use super::*;
fn message() -> Subscribe {
Subscribe::new([Subscription::new(1, 10), Subscription::new(2, 20)])
}
#[test]
fn test_encode() {
insta::assert_json_snapshot!(message());
}
#[test]
fn test_roundtrip() {
let orig = message();
let buf = orig.to_string();
let msg = ClientMessage::parse_json(&buf).unwrap();
assert_eq!(msg, ClientMessage::Subscribe(orig));
}
}