#![deny(rustdoc::broken_intra_doc_links)]
#![deny(rustdoc::private_intra_doc_links)]
#![cfg_attr(coverage_nightly, feature(coverage_attribute))]
use aoc_leaderbot_aws_lib::leaderbot::storage::aws::dynamodb::DynamoDbStorage;
use aoc_leaderbot_aws_lib::leaderbot::storage::aws::dynamodb::config::table::{
BillingModeConfig, TableConfig,
};
use aws_config::BehaviorVersion;
use clap::Parser;
use dotenvy::dotenv;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let _ = dotenv();
let cli = Cli::parse();
let storage = get_storage(&cli).await;
let table_config = get_table_config(&cli);
storage.create_table(Some(table_config)).await?;
Ok(())
}
async fn get_storage(cli: &Cli) -> DynamoDbStorage {
if cli.test_endpoint_url.is_empty() {
DynamoDbStorage::new(&cli.table_name).await
} else {
let config = aws_config::defaults(BehaviorVersion::latest())
.region("ca-central-1")
.test_credentials()
.endpoint_url(&cli.test_endpoint_url)
.load()
.await;
DynamoDbStorage::with_config(&config, &cli.table_name).await
}
}
fn get_table_config(cli: &Cli) -> TableConfig {
let billing_mode = match cli.billing_mode {
cli::BillingMode::PayPerRequest => BillingModeConfig::pay_per_request(
cli.max_read_request_units,
cli.max_write_request_units,
),
cli::BillingMode::Provisioned => {
BillingModeConfig::provisioned(cli.read_capacity_units, cli.write_capacity_units)
},
};
TableConfig { billing_mode: Some(billing_mode) }
}
use cli::Cli;
#[cfg_attr(coverage_nightly, coverage(off))]
mod cli {
use aoc_leaderbot_aws_lambda_impl::leaderbot::DEFAULT_DYNAMODB_TABLE_NAME;
use aoc_leaderbot_aws_lib::leaderbot::storage::aws::dynamodb::config::table::{
DEFAULT_READ_CAPACITY_UNITS, DEFAULT_WRITE_CAPACITY_UNITS,
};
use clap::ValueEnum;
use gratte::Display;
use super::*;
#[derive(Debug, Copy, Clone, Display, ValueEnum)]
pub enum BillingMode {
PayPerRequest,
Provisioned,
}
#[derive(Debug, Parser)]
#[command(version, about = "Prepare DynamoDB table for aoc_leaderbot", long_about = None)]
pub struct Cli {
#[arg(short, long, default_value_t = DEFAULT_DYNAMODB_TABLE_NAME.into())]
pub table_name: String,
#[arg(short, long, value_enum, default_value_t = BillingMode::Provisioned)]
pub billing_mode: BillingMode,
#[arg(long)]
pub max_read_request_units: Option<i64>,
#[arg(long)]
pub max_write_request_units: Option<i64>,
#[arg(long, default_value_t = DEFAULT_READ_CAPACITY_UNITS)]
pub read_capacity_units: i64,
#[arg(long, default_value_t = DEFAULT_WRITE_CAPACITY_UNITS)]
pub write_capacity_units: i64,
#[arg(long, hide = true, default_value_t)]
pub test_endpoint_url: String,
}
}