use serde::{Deserialize, Serialize};
use std::str::FromStr;
#[derive(Serialize, Deserialize, Debug)]
pub struct SubscribeData {
pub channel: SubscribeChannel,
}
impl SubscribeData {
pub fn parse(data: &Option<serde_json::Value>) -> Result<Self, String> {
if let Some(data) = data {
match crate::commons::get_value_as_string(data, "channel") {
Ok(Some(c)) => match SubscribeChannel::from_str(&c) {
Ok(channel) => Ok(Self { channel }),
Err(_) => Err(format!("invalid data.channel: {}", c)),
},
Ok(None) => Err("data.channel is required".to_string()),
Err(err) => Err(format!("invalid data.channel: error={}", err)),
}
} else {
Err("data field is required".to_string())
}
}
}
#[derive(serde::Serialize, serde::Deserialize, Clone, Debug, strum_macros::EnumString)]
#[strum(ascii_case_insensitive)]
pub enum SubscribeChannel {
ServerTime,
}
impl std::fmt::Display for SubscribeChannel {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
SubscribeChannel::ServerTime => write!(f, "ServerTime"),
}
}
}