volumeleaders-agent 0.3.0

Agent-oriented CLI for VolumeLeaders data
use std::future::Future;
use std::io;
use std::pin::Pin;

use volumeleaders_client::{Client, ClientError};

use crate::common::auth::{handle_api_error, make_client};
use crate::output::finish_output;

pub(crate) async fn run_client_command<T, Fetch, Render>(fetch: Fetch, render: Render) -> i32
where
    Fetch: for<'a> FnOnce(&'a Client) -> Pin<Box<dyn Future<Output = Result<T, ClientError>> + 'a>>,
    Render: FnOnce(T) -> io::Result<()>,
{
    let client = match make_client().await {
        Ok(client) => client,
        Err(code) => return code,
    };

    let value = match fetch(&client).await {
        Ok(value) => value,
        Err(err) => return handle_api_error(err),
    };

    finish_output(render(value))
}