brewlog/src/presentation/cli/mod.rs
2025-11-27 14:02:38 +00:00

103 lines
2.8 KiB
Rust

pub mod bags;
pub mod roasters;
pub mod roasts;
pub mod tokens;
use std::net::SocketAddr;
use bags::{AddBagCommand, DeleteBagCommand, GetBagCommand, ListBagsCommand, UpdateBagCommand};
use clap::{Args, Parser, Subcommand};
use roasters::{AddRoasterCommand, DeleteRoasterCommand, GetRoasterCommand, UpdateRoasterCommand};
use roasts::{AddRoastCommand, DeleteRoastCommand, GetRoastCommand, ListRoastsCommand};
use tokens::{CreateTokenCommand, RevokeTokenCommand};
#[derive(Debug, Parser)]
#[command(author, version, about = "Track coffee roasts, brews, and cups", long_about = None)]
pub struct Cli {
#[arg(
long,
global = true,
env = "BREWLOG_URL",
default_value = "http://127.0.0.1:3000"
)]
pub api_url: String,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Debug, Subcommand)]
pub enum Commands {
#[command(name = "serve")]
Serve(ServeCommand),
// Tokens
#[command(name = "create-token")]
CreateToken(CreateTokenCommand),
#[command(name = "list-tokens")]
ListTokens,
#[command(name = "revoke-token")]
RevokeToken(RevokeTokenCommand),
// Roasters
#[command(name = "add-roaster")]
AddRoaster(AddRoasterCommand),
#[command(name = "list-roasters")]
ListRoasters,
#[command(name = "get-roaster")]
GetRoaster(GetRoasterCommand),
#[command(name = "update-roaster")]
UpdateRoaster(UpdateRoasterCommand),
#[command(name = "delete-roaster")]
DeleteRoaster(DeleteRoasterCommand),
// Roasts
#[command(name = "add-roast")]
AddRoast(AddRoastCommand),
#[command(name = "list-roasts")]
ListRoasts(ListRoastsCommand),
#[command(name = "get-roast")]
GetRoast(GetRoastCommand),
#[command(name = "delete-roast")]
DeleteRoast(DeleteRoastCommand),
// Bags
#[command(name = "add-bag")]
AddBag(AddBagCommand),
#[command(name = "list-bags")]
ListBags(ListBagsCommand),
#[command(name = "get-bag")]
GetBag(GetBagCommand),
#[command(name = "update-bag")]
UpdateBag(UpdateBagCommand),
#[command(name = "delete-bag")]
DeleteBag(DeleteBagCommand),
}
#[derive(Debug, Args)]
pub struct ServeCommand {
#[arg(
long,
env = "BREWLOG_DATABASE_URL",
default_value = "sqlite://brewlog.db"
)]
pub database_url: String,
#[arg(long, env = "BREWLOG_BIND_ADDRESS", default_value = "127.0.0.1:3000")]
pub bind_address: SocketAddr,
#[arg(long, env = "BREWLOG_ADMIN_PASSWORD")]
pub admin_password: Option<String>,
#[arg(long, env = "BREWLOG_ADMIN_USERNAME")]
pub admin_username: Option<String>,
}
pub(crate) fn print_json<T>(value: &T) -> anyhow::Result<()>
where
T: serde::Serialize,
{
let rendered = serde_json::to_string_pretty(value)?;
println!("{rendered}");
Ok(())
}