use anyhow::{Context, Result};
use clap::{Parser, Subcommand};
use vantage_aws::models::{log_events_table, log_groups_table};
use vantage_aws::{AwsAccount, eq};
use vantage_cli_util::{print_table, render_records};
use vantage_dataset::prelude::ReadableValueSet;
const TRAVERSE_GROUP: &str = "/ecs/ba-nginx";
#[derive(Parser)]
#[command(name = "vantage-aws-cli", about = "vantage-aws CloudWatch demo")]
struct Cli {
#[arg(long, global = true)]
region: Option<String>,
#[command(subcommand)]
command: Command,
}
#[derive(Subcommand)]
enum Command {
ListGroups {
#[arg(long)]
prefix: Option<String>,
},
ListEvents { log_group_name: String },
Traverse,
}
#[tokio::main]
async fn main() -> Result<()> {
let cli = Cli::parse();
if let Some(region) = &cli.region {
unsafe { std::env::set_var("AWS_REGION", region) };
}
let aws = AwsAccount::from_default().context(
"Set AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY/AWS_REGION, or configure ~/.aws/credentials [default]",
)?;
match cli.command {
Command::ListGroups { prefix } => {
let mut t = log_groups_table(aws);
if let Some(p) = prefix {
t.add_condition(eq("logGroupNamePrefix", p));
}
print_table(&t).await?;
}
Command::ListEvents { log_group_name } => {
let mut t = log_events_table(aws);
t.add_condition(eq("logGroupName", log_group_name));
print_table(&t).await?;
}
Command::Traverse => {
let mut groups_table = log_groups_table(aws);
groups_table.add_condition(eq("logGroupNamePrefix", TRAVERSE_GROUP));
print_table(&groups_table).await?;
println!("\n→ events via with_foreign(\"events\"):\n");
let events_any = groups_table.get_ref("events")?;
let records = events_any.list_values().await?;
render_records(&records, Some("eventId"));
}
}
Ok(())
}