avina-cli 2.2.0

Rust CLI client for the LRZ-specific features of the Openstack-based LRZ Compute Cloud.
use std::error::Error;

use chrono::{DateTime, FixedOffset};
use clap::Args;

#[cfg(not(feature = "user"))]
use crate::common::{find_id as user_find_id, find_id as project_find_id};
#[cfg(feature = "user")]
use crate::user::{
    project::find_id as project_find_id, user::find_id as user_find_id,
};

#[derive(Args, Debug)]
#[group(multiple = false)]
pub(crate) struct BudgetOverTreeFilter {
    #[clap(short, long, help = "Display entire tree", action)]
    all: bool,

    #[clap(
        short,
        long,
        help = "Display sub-tree for project with given name, ID, or OpenStack ID"
    )]
    project: Option<String>,

    #[clap(
        short,
        long,
        help = "Display sub-tree for user with given name, ID, or OpenStack ID"
    )]
    user: Option<String>,
}

pub(crate) async fn budget_over_tree(
    api: avina::Api,
    filter: BudgetOverTreeFilter,
    end: Option<DateTime<FixedOffset>>,
) -> Result<(), Box<dyn Error>> {
    let mut request = api.budget_over_tree.get();
    if filter.all {
        request.all();
    } else if let Some(project) = &filter.project {
        let project_id = project_find_id(&api, project).await?;
        request.project(project_id);
    } else if let Some(user) = &filter.user {
        let user_id = user_find_id(&api, user).await?;
        request.user(user_id);
    }
    if let Some(end) = end {
        request.end(end);
    }
    let result = request.send().await?;
    println!("{}", serde_json::to_string(&result)?);
    Ok(())
}