2022-07-10 23:47:14 +02:00
|
|
|
use rmpv::Value;
|
|
|
|
|
|
|
|
use tokio::io::Stdout;
|
|
|
|
|
2022-07-11 02:08:37 +02:00
|
|
|
use nvim_rs::{compat::tokio::Compat, Handler, Neovim};
|
2022-07-16 03:45:32 +02:00
|
|
|
use nvim_rs::create::tokio::new_parent;
|
|
|
|
use tonic::transport::Channel;
|
2022-07-10 23:47:14 +02:00
|
|
|
|
2022-07-31 13:47:55 +02:00
|
|
|
use crate::proto::{WorkspaceRequest, workspace_client::WorkspaceClient};
|
2022-07-13 01:55:04 +02:00
|
|
|
|
2022-07-10 23:47:14 +02:00
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct NeovimHandler {
|
2022-07-21 10:40:43 +02:00
|
|
|
go: bool,
|
2022-07-16 03:45:32 +02:00
|
|
|
client: WorkspaceClient<Channel>,
|
2022-07-10 23:47:14 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
impl NeovimHandler {
|
2022-07-16 03:45:32 +02:00
|
|
|
pub fn new(client: WorkspaceClient<Channel>) -> Self {
|
2022-07-21 10:40:43 +02:00
|
|
|
NeovimHandler { go: true, client }
|
|
|
|
}
|
|
|
|
|
|
|
|
async fn live_edit_worker(&self) {
|
|
|
|
while self.go {
|
|
|
|
|
|
|
|
}
|
2022-07-10 23:47:14 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[tonic::async_trait]
|
|
|
|
impl Handler for NeovimHandler {
|
|
|
|
type Writer = Compat<Stdout>;
|
|
|
|
|
|
|
|
async fn handle_request(
|
|
|
|
&self,
|
|
|
|
name: String,
|
2022-07-16 03:45:32 +02:00
|
|
|
args: Vec<Value>,
|
|
|
|
neovim: Neovim<Compat<Stdout>>,
|
2022-07-10 23:47:14 +02:00
|
|
|
) -> Result<Value, Value> {
|
|
|
|
match name.as_ref() {
|
|
|
|
"ping" => Ok(Value::from("pong")),
|
2022-07-16 03:45:32 +02:00
|
|
|
"create" => {
|
|
|
|
if args.len() < 1 {
|
|
|
|
return Err(Value::from("[!] no session key"));
|
|
|
|
}
|
|
|
|
let buf = neovim.get_current_buf().await.unwrap();
|
|
|
|
let content = buf.get_lines(0, buf.line_count().await.unwrap(), false).await.unwrap().join("\n");
|
2022-07-31 13:47:55 +02:00
|
|
|
let request = tonic::Request::new(WorkspaceRequest {
|
|
|
|
session_key: args[0].to_string(),
|
2022-07-16 03:45:32 +02:00
|
|
|
});
|
|
|
|
let mut c = self.client.clone();
|
2022-07-31 13:47:55 +02:00
|
|
|
Err(Value::from("[!] Unimplemented"))
|
|
|
|
// let resp = c.create(request).await.unwrap().into_inner();
|
|
|
|
// if resp.accepted {
|
|
|
|
// Ok(Value::from(resp.session_key))
|
|
|
|
// } else {
|
|
|
|
// Err(Value::from("[!] rejected"))
|
|
|
|
// }
|
2022-07-16 03:45:32 +02:00
|
|
|
},
|
|
|
|
"sync" => {
|
|
|
|
if args.len() < 1 {
|
|
|
|
return Err(Value::from("[!] no session key"));
|
|
|
|
}
|
|
|
|
let buf = neovim.get_current_buf().await.unwrap();
|
2022-07-31 13:47:55 +02:00
|
|
|
let request = tonic::Request::new(WorkspaceRequest {
|
|
|
|
session_key: args[0].to_string(),
|
2022-07-16 03:45:32 +02:00
|
|
|
});
|
|
|
|
let mut c = self.client.clone();
|
2022-07-31 13:47:55 +02:00
|
|
|
Err(Value::from("[!] Unimplemented"))
|
|
|
|
// let resp = c.sync(request).await.unwrap().into_inner();
|
|
|
|
// if let Some(content) = resp.content {
|
|
|
|
// buf.set_lines(
|
|
|
|
// 0,
|
|
|
|
// buf.line_count().await.unwrap(),
|
|
|
|
// false,
|
|
|
|
// content.split("\n").map(|s| s.to_string()).collect()
|
|
|
|
// ).await.unwrap();
|
|
|
|
// Ok(Value::from(""))
|
|
|
|
// } else {
|
|
|
|
// Err(Value::from("[!] no content"))
|
|
|
|
// }
|
2022-07-16 03:45:32 +02:00
|
|
|
},
|
|
|
|
"leave" => {
|
|
|
|
if args.len() < 1 {
|
|
|
|
return Err(Value::from("[!] no session key"));
|
|
|
|
}
|
2022-07-31 13:47:55 +02:00
|
|
|
let request = tonic::Request::new(WorkspaceRequest {
|
|
|
|
session_key: args[0].to_string(),
|
2022-07-16 03:45:32 +02:00
|
|
|
});
|
|
|
|
let mut c = self.client.clone();
|
2022-07-31 13:47:55 +02:00
|
|
|
Err(Value::from("[!] Unimplemented"))
|
|
|
|
// let resp = c.leave(request).await.unwrap().into_inner();
|
|
|
|
// if resp.accepted {
|
|
|
|
// Ok(Value::from(format!("closed session #{}", resp.session_key)))
|
|
|
|
// } else {
|
|
|
|
// Err(Value::from("[!] could not close session"))
|
|
|
|
// }
|
2022-07-10 23:47:14 +02:00
|
|
|
},
|
2022-07-11 02:08:37 +02:00
|
|
|
_ => {
|
|
|
|
eprintln!("[!] unexpected call");
|
|
|
|
Ok(Value::from(""))
|
|
|
|
},
|
2022-07-10 23:47:14 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2022-07-11 02:08:37 +02:00
|
|
|
async fn handle_notify(
|
|
|
|
&self,
|
|
|
|
name: String,
|
|
|
|
_args: Vec<Value>,
|
|
|
|
_neovim: Neovim<Compat<Stdout>>,
|
|
|
|
) {
|
|
|
|
match name.as_ref() {
|
|
|
|
"insert" => {},
|
|
|
|
"tick" => eprintln!("tock"),
|
|
|
|
_ => eprintln!("[!] unexpected notify",)
|
2022-07-10 23:47:14 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2022-07-16 03:45:32 +02:00
|
|
|
|
|
|
|
pub async fn run_nvim_client(c: WorkspaceClient<Channel>) -> Result<(), Box<dyn std::error::Error + 'static>> {
|
|
|
|
let handler: NeovimHandler = NeovimHandler::new(c);
|
|
|
|
let (_nvim, io_handler) = new_parent(handler).await;
|
|
|
|
|
|
|
|
// Any error should probably be logged, as stderr is not visible to users.
|
|
|
|
match io_handler.await {
|
|
|
|
Err(err) => eprintln!("Error joining IO loop: {:?}", err),
|
|
|
|
Ok(Err(err)) => eprintln!("Process ended with error: {:?}", err),
|
|
|
|
Ok(Ok(())) => eprintln!("Finished"),
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|