use std::fmt::Debug;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum UnidentifiedRequest {
NewSession { name: String },
SessionExit { name: String },
Shutdown,
}
impl UnidentifiedRequest {
pub fn with_session(self, name: impl Into<String>) -> Self {
let name = name.into();
match self {
UnidentifiedRequest::NewSession { .. } => UnidentifiedRequest::NewSession { name },
UnidentifiedRequest::SessionExit { .. } => UnidentifiedRequest::SessionExit { name },
_ => self,
}
}
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Request {
TryEnableHighlight { lang: String, client: String },
Highlight {
client: String,
buffer: String,
lang: String,
timestamp: u64,
},
}
impl Request {
pub fn client_name(&self) -> Option<&str> {
match self {
Request::TryEnableHighlight { client, .. } => Some(client.as_str()),
Request::Highlight { client, .. } => Some(client.as_str()),
}
}
}
#[cfg(test)]
mod tests {
use super::Request;
#[test]
fn serialization() {
let req = Request::Highlight {
client: "client0".to_owned(),
buffer: "/tmp/a.rs".to_owned(),
lang: "rust".to_owned(),
timestamp: 0,
};
let expected =
r#"{"type":"highlight","client":"client0","buffer":"/tmp/a.rs","lang":"rust","timestamp":0}"#;
let serialized = serde_json::to_string(&req);
assert_eq!(serialized.unwrap(), expected);
}
}