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}