use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "snake_case")]
pub enum IbmGroupBy {
#[default]
Month,
Location,
Service,
Account,
}
impl IbmGroupBy {
pub fn as_str(&self) -> &'static str {
match self {
IbmGroupBy::Month => "month",
IbmGroupBy::Location => "location",
IbmGroupBy::Service => "service",
IbmGroupBy::Account => "account",
}
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct IbmConfig {
pub api_key: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct IbmQueryConfig {
pub enterprise_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub group_by: Option<IbmGroupBy>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enterprise_account_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub offset: Option<i32>,
}
impl Default for IbmQueryConfig {
fn default() -> Self {
Self {
enterprise_id: String::new(),
group_by: Some(IbmGroupBy::Month),
enterprise_account_id: None,
limit: None,
offset: None,
}
}
}
impl IbmQueryConfig {
pub fn validate(&self) -> Result<(), String> {
if self.enterprise_id.is_empty() {
return Err("enterprise_id is required and cannot be empty".to_string());
}
Ok(())
}
}
#[derive(Debug, Clone, Serialize)]
pub struct IbmCarbonEmissionRequest {
pub(super) enterprise_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub(super) month: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(super) locations: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(super) services: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(super) enterprise_account_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(super) group_by: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(super) limit: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(super) offset: Option<i32>,
}
#[allow(dead_code)] #[derive(Debug, Clone, Deserialize)]
pub struct IbmMonthInfo {
pub(super) value: String,
#[serde(default)]
pub(super) min: Option<String>,
#[serde(default)]
pub(super) max: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct IbmGroupByInfo {
#[serde(rename = "type")]
pub(super) group_type: String,
pub(super) value: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct IbmEmissionData {
pub(super) account_id: String,
pub(super) carbon_emission: f64,
pub(super) energy_consumption: f64,
pub(super) month: IbmMonthInfo,
#[serde(default)]
pub(super) group_by: Option<IbmGroupByInfo>,
#[serde(default)]
pub(super) location: Option<String>,
#[serde(default)]
pub(super) service: Option<String>,
}
#[allow(dead_code)] #[derive(Debug, Clone, Deserialize)]
pub struct IbmPaginationLink {
pub(super) href: String,
}
#[allow(dead_code)] #[derive(Debug, Clone, Deserialize)]
pub struct IbmCarbonEmissionResponse {
pub(super) carbon_emissions: Vec<IbmEmissionData>,
#[serde(default)]
pub(super) total_emission: Option<f64>,
#[serde(default)]
pub(super) offset: Option<i32>,
#[serde(default)]
pub(super) limit: Option<i32>,
#[serde(default)]
pub(super) total_count: Option<i64>,
#[serde(default)]
pub(super) first: Option<IbmPaginationLink>,
#[serde(default)]
pub(super) last: Option<IbmPaginationLink>,
#[serde(default)]
pub(super) previous: Option<IbmPaginationLink>,
#[serde(default)]
pub(super) next: Option<IbmPaginationLink>,
}