Update based on https://platform.claude.com/docs/en/agent-sdk/overview#branding-guidelines ACP package will be updated shortly. Release Notes: - acp: Claude Code is now referred to as Claude Agent, per Anthropic branding guidelines.
52 lines
1.7 KiB
Rust
52 lines
1.7 KiB
Rust
use anyhow::Result;
|
|
|
|
#[cfg(windows)]
|
|
pub fn main(_socket: &str) -> Result<()> {
|
|
// It looks like we can't get an async stdio stream on Windows from smol.
|
|
panic!("--nc isn't yet supported on Windows");
|
|
}
|
|
|
|
/// The main function for when Zed is running in netcat mode
|
|
#[cfg(not(windows))]
|
|
pub fn main(socket: &str) -> Result<()> {
|
|
use futures::{AsyncReadExt as _, AsyncWriteExt as _, FutureExt as _, io::BufReader, select};
|
|
use net::async_net::UnixStream;
|
|
use smol::{Unblock, io::AsyncBufReadExt};
|
|
|
|
smol::block_on(async {
|
|
let socket_stream = UnixStream::connect(socket).await?;
|
|
let (socket_read, mut socket_write) = socket_stream.split();
|
|
let mut socket_reader = BufReader::new(socket_read);
|
|
|
|
let mut stdout = Unblock::new(std::io::stdout());
|
|
let stdin = Unblock::new(std::io::stdin());
|
|
let mut stdin_reader = BufReader::new(stdin);
|
|
|
|
let mut socket_line = Vec::new();
|
|
let mut stdin_line = Vec::new();
|
|
|
|
loop {
|
|
select! {
|
|
bytes_read = socket_reader.read_until(b'\n', &mut socket_line).fuse() => {
|
|
if bytes_read? == 0 {
|
|
break
|
|
}
|
|
stdout.write_all(&socket_line).await?;
|
|
stdout.flush().await?;
|
|
socket_line.clear();
|
|
}
|
|
bytes_read = stdin_reader.read_until(b'\n', &mut stdin_line).fuse() => {
|
|
if bytes_read? == 0 {
|
|
break
|
|
}
|
|
socket_write.write_all(&stdin_line).await?;
|
|
socket_write.flush().await?;
|
|
stdin_line.clear();
|
|
}
|
|
}
|
|
}
|
|
|
|
anyhow::Ok(())
|
|
})
|
|
}
|