git-remote-iroh 0.1.0

Git remote protocol support for https://www.iroh.computer
Documentation
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(()))
}