use clap::Parser;
use git_remote_iroh::{Client, ClientArgs, Server, ServerArgs};
use tokio::io::{stdin, stdout};
use tokio_util::sync::CancellationToken;
use tracing::{debug, info, warn};
#[tokio::main]
async fn main() -> Result<(), anyhow::Error> {
tracing_subscriber::fmt()
.with_writer(std::io::stderr)
.with_env_filter(tracing_subscriber::EnvFilter::from_default_env())
.init();
let mut errs = vec![];
match ClientArgs::try_parse() {
Ok(args) => {
debug!(?args);
let client = Client::new(args)?;
client.run(stdin(), stdout()).await?;
return Ok(());
}
Err(err) => errs.push(err),
}
match ServerArgs::try_parse() {
Ok(args) => {
debug!(?args);
let server = Server::new(args)?;
let cancel = CancellationToken::new();
{
let cancel = cancel.clone();
tokio::spawn(async move {
tokio::signal::ctrl_c().await.ok();
warn!("interrupt received");
cancel.cancel();
});
}
server.run(cancel).await?;
info!("exiting");
return Ok(());
}
Err(err) => errs.push(err),
}
errs.iter().for_each(|err| eprintln!("{}", err));
errs.pop().map(|err| Err(err.into())).unwrap_or(Ok(()))
}