actrpc-cli 0.1.0

Command-line tools for ActRPC.
mod args;
mod cli_params;
mod cli_review_provider;

use crate::{
    args::{CliArgs, CliCommand},
    cli_params::parse_params,
    cli_review_provider::CliReviewProvider,
};
use actrpc_orchestrator::{
    config::OrchestratorConfig,
    method::{MethodName, ProviderName},
    runtime::{CallExecutionFactory, DefaultOrchestrator},
};
use actrpc_transport::DefaultJsonRpcClientProvider;
use clap::Parser;
use std::{error::Error, io, sync::Arc};

#[tokio::main]
async fn main() {
    if let Err(error) = run().await {
        eprintln!("error: {error}");
        std::process::exit(1);
    }
}

async fn run() -> Result<(), Box<dyn Error>> {
    let args = CliArgs::parse();

    let config = OrchestratorConfig::from_paths(&args.configs)?;

    let provider = DefaultJsonRpcClientProvider::new();

    let resources = config
        .build_resources(&provider, Arc::new(CliReviewProvider))
        .await?;

    let orchestrator =
        DefaultOrchestrator::new(Arc::new(CallExecutionFactory::new(Arc::new(resources))));

    match args.command {
        CliCommand::Call {
            provider,
            method,
            params,
        } => {
            let params = parse_params(params)
                .map_err(|message| io::Error::new(io::ErrorKind::InvalidInput, message))?;

            let result = orchestrator
                .call(
                    ProviderName::from(provider),
                    MethodName::from(method),
                    params,
                )
                .await?;

            println!("{}", serde_json::to_string_pretty(&result)?);
        }
    }

    Ok(())
}