use crate::live::Subscription;
use crate::utils::Json;
use crate::utils::json::BadJson;
pub const PING: &str = r#"{"method":"ping"}"#;
#[must_use]
pub fn subscribe(subscription: &Subscription) -> String {
wrap("subscribe", subscription)
}
#[must_use]
pub fn unsubscribe(subscription: &Subscription) -> String {
wrap("unsubscribe", subscription)
}
fn wrap(method: &str, subscription: &Subscription) -> String {
Json::Object(vec![
("method".to_owned(), Json::String(method.to_owned())),
("subscription".to_owned(), subscription.to_json()),
])
.compact()
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Post {
Info(Json),
Action(Json),
}
impl Post {
pub fn info(request: &str) -> Result<Post, BadJson> {
Json::parse(request).map(Post::Info)
}
pub fn action(body: &str) -> Result<Post, BadJson> {
Json::parse(body).map(Post::Action)
}
#[must_use]
pub const fn kind(&self) -> &'static str {
match self {
Post::Info(_) => "info",
Post::Action(_) => "action",
}
}
#[must_use]
pub const fn payload(&self) -> &Json {
match self {
Post::Info(payload) | Post::Action(payload) => payload,
}
}
}
#[must_use]
pub fn post(id: u64, request: &Post) -> String {
Json::Object(vec![
("method".to_owned(), Json::String("post".to_owned())),
("id".to_owned(), Json::Number(id.to_string())),
(
"request".to_owned(),
Json::Object(vec![
("type".to_owned(), Json::String(request.kind().to_owned())),
("payload".to_owned(), request.payload().clone()),
]),
),
])
.compact()
}
#[cfg(test)]
#[path = "tests/request.rs"]
mod tests;