1use std::path::PathBuf;
4
5use anyhow::Context;
6use bobashare::storage::file::FileBackend;
7use clap::{Parser, Subcommand};
8use cli::*;
9use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};
10
11pub(crate) mod cli;
12
13#[derive(Debug, Clone, Parser)]
14pub(crate) struct Cli {
15    #[clap(short, long, value_parser, default_value = "storage/")]
16    root: PathBuf,
17    #[clap(subcommand)]
18    command: Command,
19}
20#[derive(Debug, Clone, Subcommand)]
21pub(crate) enum Command {
22    CreateUpload(create::CreateUpload),
23    Cleanup(cleanup::Cleanup),
24}
25
26#[tokio::main]
27async fn main() -> anyhow::Result<()> {
28    tracing_subscriber::registry()
30        .with(tracing_subscriber::EnvFilter::new(
31            std::env::var("RUST_LOG").unwrap_or_else(|_| "debug,bobashare=debug".into()),
32        ))
33        .with(tracing_subscriber::fmt::layer())
34        .init();
35
36    let cli = Cli::parse();
37    let backend = FileBackend::new(cli.root)
38        .await
39        .context("error creating file backend")?;
40
41    match cli.command {
42        Command::CreateUpload(args) => {
43            cli::create::create_upload(backend, args).await?;
44        }
45        Command::Cleanup(args) => {
46            cli::cleanup::cleanup(backend, args).await?;
47        }
48    };
49
50    Ok(())
51}