diff --git a/crates/zed/src/main.rs b/crates/zed/src/main.rs index a70473087e..03ceef3a43 100644 --- a/crates/zed/src/main.rs +++ b/crates/zed/src/main.rs @@ -3,17 +3,23 @@ use anyhow::{anyhow, Context, Result}; use assets::Assets; -use cli::{ipc, CliRequest, CliResponse, IpcHandshake}; +use cli::{ + ipc::{self, IpcSender}, + CliRequest, CliResponse, IpcHandshake, +}; use client::{self, http, ChannelList, UserStore}; use fs::OpenOptions; -use futures::{channel::oneshot, StreamExt}; +use futures::{ + channel::{mpsc, oneshot}, + SinkExt, StreamExt, +}; use gpui::{App, AssetSource, Task}; use log::LevelFilter; use parking_lot::Mutex; use project::Fs; use settings::{self, KeymapFile, Settings, SettingsFileContent}; use smol::process::Command; -use std::{env, fs, path::PathBuf, sync::Arc}; +use std::{env, fs, path::PathBuf, sync::Arc, thread}; use theme::{ThemeRegistry, DEFAULT_THEME_NAME}; use util::ResultExt; use workspace::{self, AppState, OpenNew, OpenPaths}; @@ -88,9 +94,33 @@ fn main() { }) }; - app.on_open_urls(|urls, _| { + app.on_open_urls(|urls, cx| { if let Some(server_name) = urls.first().and_then(|url| url.strip_prefix("zed-cli://")) { - connect_to_cli(server_name).log_err(); + if let Some((mut requests, responses)) = connect_to_cli(server_name).log_err() { + cx.spawn(|_| async move { + for request in requests.next().await { + match request { + CliRequest::Open { paths, wait } => { + if wait { + todo!(); + } + + log::info!("open paths {:?}", paths); + responses + .send(CliResponse::Stdout { + message: "Hello CLI!".to_string(), + }) + .log_err(); + responses.send(CliResponse::Exit { status: 0 }).log_err(); + + // TODO... get rid of AppState so we can do this here? + // cx.update(|cx| open_paths(&paths, app_state, cx)); + } + } + } + }) + .detach(); + }; } }); @@ -300,7 +330,9 @@ fn load_config_files( rx } -fn connect_to_cli(server_name: &str) -> Result<()> { +fn connect_to_cli( + server_name: &str, +) -> Result<(mpsc::Receiver, IpcSender)> { let handshake_tx = cli::ipc::IpcSender::::connect(server_name.to_string()) .context("error connecting to cli")?; let (request_tx, request_rx) = ipc::channel::()?; @@ -313,15 +345,16 @@ fn connect_to_cli(server_name: &str) -> Result<()> { }) .context("error sending ipc handshake")?; - std::thread::spawn(move || { + let (mut async_request_tx, async_request_rx) = + futures::channel::mpsc::channel::(16); + thread::spawn(move || { while let Ok(cli_request) = request_rx.recv() { - log::info!("{cli_request:?}"); - response_tx.send(CliResponse::Stdout { - message: "Hi, CLI!".into(), - })?; - response_tx.send(CliResponse::Exit { status: 0 })?; + if smol::block_on(async_request_tx.send(cli_request)).is_err() { + break; + } } Ok::<_, anyhow::Error>(()) }); - Ok(()) + + Ok((async_request_rx, response_tx)) }