mod buffer;
mod convert;
mod nvim;
mod tabpage;
mod window;
use crate::error::Error;
use crate::handler::{NotificationHandler, RequestHandler};
use crate::session::Session;
use rmpv::Value;
use std::sync::{Arc, Mutex};
pub struct Nvim {
session: Arc<Mutex<Session>>,
}
impl Nvim {
pub fn from_session(session: Session) -> Self {
Nvim { session: Arc::new(Mutex::new(session)) }
}
pub fn from_tcp(addr: &str) -> Result<Self, Error> {
Ok(Nvim {
session: Arc::new(Mutex::new(Session::from_tcp(addr)?)),
})
}
pub fn from_parent() -> Result<Self, Error> {
Ok(Nvim {
session: Arc::new(Mutex::new(Session::from_parent()?)),
})
}
#[cfg(unix)]
pub fn from_unix(path: &str) -> Result<Self, Error> {
Ok(Nvim {
session: Arc::new(Mutex::new(Session::from_unix(path)?)),
})
}
pub fn start_event_loop(
&mut self,
request_handler: Option<Box<dyn RequestHandler + Send>>,
notification_handler: Option<Box<dyn NotificationHandler + Send>>,
) {
let mut session = self.session.lock().unwrap();
session
.start_event_loop(request_handler, notification_handler)
}
pub fn call(&mut self, method: &str, args: Vec<Value>) {
let mut session = self.session.lock().unwrap();
session.call(method, args).unwrap();
}
}
#[derive(Clone)]
pub struct Buffer {
data: Value,
session: Arc<Mutex<Session>>,
}
impl Buffer {
pub fn new(data: Value, session: Arc<Mutex<Session>>) -> Self {
Buffer { data, session }
}
}
impl From<Buffer> for Value {
fn from(value: Buffer) -> Self {
value.data
}
}
#[derive(Clone)]
pub struct Tabpage {
data: Value,
session: Arc<Mutex<Session>>,
}
impl Tabpage {
pub fn new(data: Value, session: Arc<Mutex<Session>>) -> Self {
Tabpage { data, session }
}
}
impl From<Tabpage> for Value {
fn from(value: Tabpage) -> Self {
value.data
}
}
#[derive(Clone)]
pub struct Window {
data: Value,
session: Arc<Mutex<Session>>,
}
impl Window {
pub fn new(data: Value, session: Arc<Mutex<Session>>) -> Self {
Window { data, session }
}
}
impl From<Window> for Value {
fn from(value: Window) -> Self {
value.data
}
}