Run

Create the run function that handles the execution of the chosen subcommand (ReadCount or IncrementCount).

  • For ReadCount, it compiles the Pint project, queries the current count, and displays it.
  • For IncrementCount, it compiles the project, queries the current count, creates an incremented solution, submits it to the builder, and displays the new count:
#![allow(unused)]
fn main() {
async fn run(cli: Cli) -> anyhow::Result<()> {
    let Cli { command } = cli;
    match command {
        Command::ReadCount {
            server: Shared {
                node_api,
                pint_directory,
            },
        } => {
            let address = compile_address(pint_directory).await?;
            let node = EssentialNodeClient::new(node_api)?;
            let key = counter_key();
            let count = query_count(node, address.contract, key).await?;
            let count_value = extract_count(count)?;
            println!("Current count is: {}", count_value);
        }
        Command::IncrementCount {
            builder_api,
            server: Shared {
                node_api,
                pint_directory,
            },
        } => {
            let address = compile_address(pint_directory).await?;
            let node = EssentialNodeClient::new(node_api)?;
            let key = counter_key();
            let count = query_count(node, address.contract.clone(), key).await?;
            let (solution, new_count) = incremented_solution(count)?; // Pass only count
            let builder =
                essential_rest_client::builder_client::EssentialBuilderClient::new(builder_api)?;
            let ca = builder.submit_solution(&solution).await?;
            println!("Submitted solution: {}", ca);
            println!("Incremented count to: {}", new_count);
        }
    }
    Ok(())
}
}

Add the main entry point of the application. It uses tokio for asynchronous execution, parses the command-line arguments, and calls the run function to execute the appropriate command:

#[tokio::main]
async fn main() {
    let args = Cli::parse();
    if let Err(err) = run(args).await {
        eprintln!("Command failed because: {}", err);
    }
}