use carbem::CarbemClient;
use carbem::models::{EmissionQuery, TimePeriod};
use carbem::{AzureCarbonScope, AzureQueryConfig, AzureReportType, ProviderQueryConfig};
use chrono::{TimeZone, Utc};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = CarbemClient::builder().with_azure_from_env()?.build();
let query = EmissionQuery {
provider: "azure".to_string(),
regions: vec!["eastus".to_string(), "westus".to_string()], time_period: TimePeriod {
start: Utc.with_ymd_and_hms(2024, 9, 1, 0, 0, 0).unwrap(),
end: Utc.with_ymd_and_hms(2024, 9, 30, 23, 59, 59).unwrap(),
},
services: None,
resources: None,
provider_config: Some(ProviderQueryConfig::Azure(AzureQueryConfig {
report_type: AzureReportType::MonthlySummaryReport,
subscription_list: vec!["your-subscription-id".to_string()], carbon_scope_list: Some(vec![AzureCarbonScope::Scope1, AzureCarbonScope::Scope3]),
category_type: None,
order_by: None,
page_size: None,
sort_direction: None,
top_items: None,
resource_group_url_list: None,
resource_type_list: None,
skip_token: None,
})),
};
println!("Querying Azure carbon emissions...");
match client.query_emissions(&query).await {
Ok(emissions) => {
println!("\n✅ Found {} emission records:", emissions.len());
for emission in emissions {
println!(
" 📍 {} | 🏷️ {} | 💨 {:.4} kg CO2eq | 📅 {}",
emission.region,
emission.service.unwrap_or_else(|| "overall".to_string()),
emission.emissions_kg_co2eq,
emission.time_period.start.format("%Y-%m-%d")
);
}
}
Err(e) => {
eprintln!("❌ Error querying emissions: {}", e);
std::process::exit(1);
}
}
Ok(())
}