use std::path::PathBuf;
use std::{fmt::Debug, fs};
use serde::{de::DeserializeOwned, Deserialize, Serialize};
use crate::session::KakSession;
#[derive(Debug, Deserialize, Serialize)]
pub struct Request<Origin>
where
Origin: RequestOrigin,
{
pub session: KakSession,
pub payload: RequestPayload<Origin>,
}
impl<Origin> Request<Origin>
where
Origin: RequestOrigin,
{
pub fn new(session: KakSession, payload: RequestPayload<Origin>) -> Self {
Self { session, payload }
}
}
impl Request<KakouneOrigin> {
pub fn reinterpret(self) -> Request<KakTreeSitterOrigin> {
let payload = match self.payload {
RequestPayload::SessionEnd => RequestPayload::SessionEnd,
RequestPayload::Shutdown => RequestPayload::Shutdown,
RequestPayload::TryEnableHighlight { lang } => RequestPayload::TryEnableHighlight { lang },
RequestPayload::Highlight {
buffer,
lang,
timestamp,
payload,
} => {
let source = fs::read_to_string(payload).unwrap(); RequestPayload::Highlight {
buffer,
lang,
timestamp,
payload: source,
}
}
};
Request::new(self.session, payload)
}
}
pub trait RequestOrigin {
type HighlightPayload: Debug + DeserializeOwned + Serialize;
}
#[derive(Debug, Deserialize, Serialize)]
pub enum KakouneOrigin {}
impl RequestOrigin for KakouneOrigin {
type HighlightPayload = PathBuf;
}
#[derive(Debug, Deserialize, Serialize)]
pub enum KakTreeSitterOrigin {}
impl RequestOrigin for KakTreeSitterOrigin {
type HighlightPayload = String;
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum RequestPayload<Origin>
where
Origin: RequestOrigin,
{
SessionEnd,
Shutdown,
TryEnableHighlight { lang: String },
Highlight {
buffer: String,
lang: String,
timestamp: u64,
payload: Origin::HighlightPayload,
},
}
#[cfg(test)]
mod tests {
use std::path::PathBuf;
use crate::request::{KakTreeSitterOrigin, KakouneOrigin};
use super::RequestPayload;
#[test]
fn serialization() {
let kak_req = RequestPayload::<KakouneOrigin>::Highlight {
buffer: "/tmp/a.rs".to_owned(),
lang: "rust".to_owned(),
timestamp: 0,
payload: PathBuf::from("/tmp/a.fifo"),
};
let expected = r#"{"type":"highlight","buffer":"/tmp/a.rs","lang":"rust","timestamp":0,"payload":"/tmp/a.fifo"}"#;
let serialized = serde_json::to_string(&kak_req);
assert_eq!(serialized.unwrap(), expected);
let kts_req = RequestPayload::<KakTreeSitterOrigin>::Highlight {
buffer: "/tmp/a.rs".to_owned(),
lang: "rust".to_owned(),
timestamp: 0,
payload: "lol".to_owned(),
};
let expected =
r#"{"type":"highlight","buffer":"/tmp/a.rs","lang":"rust","timestamp":0,"payload":"lol"}"#;
let serialized = serde_json::to_string(&kts_req);
assert_eq!(serialized.unwrap(), expected);
}
}