use std::error::Error;
use async_trait::async_trait;
use rmpv::Value;
use tokio::fs::File as TokioFile;
use nvim_rs::{
compat::tokio::Compat, create::tokio as create, Handler, Neovim,
};
#[derive(Clone)]
struct NeovimHandler {}
#[async_trait]
impl Handler for NeovimHandler {
type Writer = Compat<TokioFile>;
async fn handle_request(
&self,
name: String,
_args: Vec<Value>,
neovim: Neovim<Compat<TokioFile>>,
) -> Result<Value, Value> {
match name.as_ref() {
"file" => {
let c = neovim.get_current_buf().await.unwrap();
for _ in 0..1_000_usize {
let _x = c.get_lines(0, -1, false).await;
}
Ok(Value::Nil)
}
"buffer" => {
for _ in 0..10_000_usize {
let _ = neovim.get_current_buf().await.unwrap();
}
Ok(Value::Nil)
}
"api" => {
for _ in 0..1_000_usize {
let _ = neovim.get_api_info().await.unwrap();
}
Ok(Value::Nil)
}
_ => Ok(Value::Nil),
}
}
}
#[tokio::main]
async fn main() {
let handler: NeovimHandler = NeovimHandler {};
let (nvim, io_handler) = create::new_parent(handler).await.unwrap();
match io_handler.await {
Err(joinerr) => eprintln!("Error joining IO loop: '{}'", joinerr),
Ok(Err(err)) => {
if !err.is_reader_error() {
nvim
.err_writeln(&format!("Error: '{}'", err))
.await
.unwrap_or_else(|e| {
eprintln!("Well, dang... '{}'", e);
});
}
if !err.is_channel_closed() {
eprintln!("Error: '{}'", err);
let mut source = err.source();
while let Some(e) = source {
eprintln!("Caused by: '{}'", e);
source = e.source();
}
}
}
Ok(Ok(())) => {}
}
}