use serde::{Deserialize, Serialize};
use crate::{
error::OhNo,
kakoune::{buffer::BufferId, text_objects::OperationMode},
tree_sitter::nav,
};
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub struct Metadata {
pub session: String,
pub client: Option<String>,
pub buffer: Option<String>,
}
impl Metadata {
fn new(session: impl Into<String>) -> Self {
Self {
session: session.into(),
client: None,
buffer: None,
}
}
pub fn to_buffer_id(&self) -> Result<BufferId, OhNo> {
let buffer = self.buffer.clone().ok_or_else(|| OhNo::UnknownBuffer {
id: BufferId::new(self.session.clone(), String::new()),
})?;
Ok(BufferId::new(self.session.clone(), buffer))
}
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub struct Request {
pub metadata: Metadata,
pub payload: Payload,
}
impl Request {
pub fn from_json(s: impl AsRef<str>) -> Result<Self, OhNo> {
let s = s.as_ref();
serde_json::from_str(s).map_err(|err| OhNo::InvalidRequest {
req: s.to_owned(),
err: err.to_string(),
})
}
pub fn init_session(session: impl Into<String>) -> Self {
Self {
metadata: Metadata::new(session),
payload: Payload::SessionBegin,
}
}
pub fn session(&self) -> &str {
&self.metadata.session
}
}
#[derive(Debug, Deserialize, Serialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Payload {
SessionBegin,
SessionEnd,
Reload,
Shutdown,
BufferMetadata { lang: String },
BufferClose,
TextObjects {
pattern: String,
selections: String,
mode: OperationMode,
},
Nav { selections: String, dir: nav::Dir },
Version,
}