use clap::{
App,
AppSettings::{DisableHelpSubcommand, Hidden},
IntoApp, Parser, Subcommand,
};
use clap_complete::{generate, Generator, Shell};
use std::io;
use pmis::{operations, PathBuf, Result, Url, Uuid};
#[derive(Parser)]
#[clap(author, version, about)]
#[clap(global_setting(DisableHelpSubcommand))]
struct Cli {
#[clap(long, default_value = "https://paste.misterio.me")]
api: Url,
#[clap(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
#[clap(alias = "l", alias = "ls")]
List {
owner: Option<String>,
#[clap(short, long)]
ids_only: bool,
},
#[clap(alias = "d", alias = "down", alias = "get")]
Download {
id: Uuid,
#[clap(short, long)]
raw: bool,
},
#[clap(alias = "u", alias = "up", alias = "create", alias = "post")]
Upload {
file: Option<PathBuf>,
#[clap(short, long)]
title: Option<String>,
#[clap(short, long)]
description: Option<String>,
#[clap(short, long)]
unlisted: bool,
#[clap(short, long)]
link_only: bool,
},
#[clap(alias = "del")]
Delete { id: Uuid },
Auth,
#[clap(setting(Hidden))]
Completions { shell: Shell },
}
fn print_completions<G: Generator>(gen: G, app: &mut App) {
generate(gen, app, app.get_name().to_string(), &mut io::stdout());
}
#[tokio::main]
async fn main() -> Result<()> {
let cli = Cli::parse();
let api = cli.api;
let mut app = Cli::into_app();
match cli.command {
Commands::List { owner, ids_only } => operations::list(api, owner, ids_only).await?,
Commands::Download { id, raw } => operations::download(api, id, raw).await?,
Commands::Upload {
file,
title,
description,
unlisted,
link_only,
} => operations::upload(api, file, title, description, unlisted, link_only).await?,
Commands::Delete { id } => operations::delete(api, id).await?,
Commands::Auth => operations::auth(api).await?,
Commands::Completions { shell } => print_completions(shell, &mut app),
}
Ok(())
}