use std::marker::PhantomData;
use std::sync::mpsc::{SendError, SyncSender};
mod main_thread;
mod plain_backend;
mod vim8_backend;
mod worker;
pub use self::main_thread::interact_command;
#[derive(Clone, Debug)]
pub enum ToServer {
AddMark {
file: String,
line: u32,
col: u32,
kind: String,
label: String,
},
RemoveMark { id: usize },
GetMarkInfo { id: usize },
GetMarkList,
SetBuffersAvailable { files: Vec<String> },
BufferText { file: String, content: String },
RunCommand { name: String, args: Vec<String> },
}
#[derive(Clone, Debug)]
pub struct MarkInfo {
id: usize,
file: String,
start_line: u32,
start_col: u32,
end_line: u32,
end_col: u32,
labels: Vec<String>,
}
#[derive(Clone, Debug)]
pub enum ToClient {
Mark {
info: MarkInfo,
},
MarkList {
infos: Vec<MarkInfo>,
},
GetBufferText {
file: String,
},
NewBufferText {
file: String,
content: String,
},
Error {
text: String,
},
}
#[derive(Clone, Debug)]
pub struct WrapSender<T, U, F>
where
F: Fn(T) -> U,
{
inner: SyncSender<U>,
convert: F,
_marker: PhantomData<T>,
}
impl<T, U, F> WrapSender<T, U, F>
where
F: Fn(T) -> U,
{
pub fn new(inner: SyncSender<U>, convert: F) -> WrapSender<T, U, F> {
WrapSender {
inner,
convert,
_marker: PhantomData,
}
}
pub fn send(&self, t: T) -> Result<(), SendError<U>> {
let u = (self.convert)(t);
self.inner.send(u)
}
}