use std::path::PathBuf;
use clap::{Args, Parser, Subcommand, ValueEnum};
use url::Url;
#[derive(Debug, Parser)]
#[command(
name = "wepub",
version,
about = "Publish browser extensions to web stores"
)]
pub struct Cli {
#[arg(short = 'v', long = "verbose", global = true)]
pub verbose: bool,
#[arg(short = 'q', long = "quiet", global = true, conflicts_with = "verbose")]
pub quiet: bool,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Debug, Subcommand)]
pub enum Commands {
Chrome(ChromeArgs),
Firefox(FirefoxArgs),
Edge(EdgeArgs),
}
#[derive(Debug, Args)]
pub struct ChromeArgs {
#[arg(value_name = "ZIP")]
pub zip: PathBuf,
#[arg(long, env = "WEPUB_CHROME_PUBLISHER_ID")]
pub publisher_id: String,
#[arg(long, env = "WEPUB_CHROME_ITEM_ID")]
pub item_id: String,
#[arg(long, env = "WEPUB_CHROME_CLIENT_ID")]
pub client_id: Option<String>,
#[arg(long, env = "WEPUB_CHROME_CLIENT_SECRET")]
pub client_secret: Option<String>,
#[arg(long, env = "WEPUB_CHROME_REFRESH_TOKEN")]
pub refresh_token: Option<String>,
#[arg(long, env = "WEPUB_CHROME_ACCESS_TOKEN")]
pub access_token: Option<String>,
#[arg(long, value_enum)]
pub publish_type: Option<ChromePublishTypeArg>,
#[arg(long, value_name = "N", value_parser = clap::value_parser!(u8).range(0..=100))]
pub deploy_percentage: Option<u8>,
#[arg(long)]
pub skip_review: Option<bool>,
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum ChromePublishTypeArg {
Default,
Staged,
}
#[derive(Debug, Args)]
#[command(group(
clap::ArgGroup::new("release_notes_input")
.multiple(false)
.args(["release_notes", "release_notes_file"]),
))]
#[command(group(
clap::ArgGroup::new("approval_notes_input")
.multiple(false)
.args(["approval_notes", "approval_notes_file"]),
))]
pub struct FirefoxArgs {
#[arg(value_name = "ZIP")]
pub zip: PathBuf,
#[arg(long, env = "WEPUB_FIREFOX_ADDON_ID")]
pub addon_id: String,
#[arg(long, env = "WEPUB_FIREFOX_API_KEY")]
pub api_key: String,
#[arg(long, env = "WEPUB_FIREFOX_API_SECRET")]
pub api_secret: String,
#[arg(long, value_enum)]
pub channel: FirefoxChannelArg,
#[arg(long, value_delimiter = ',')]
pub compatibility: Vec<FirefoxApplicationArg>,
#[arg(long)]
pub approval_notes: Option<String>,
#[arg(long, value_name = "PATH")]
pub approval_notes_file: Option<PathBuf>,
#[arg(long)]
pub release_notes: Option<String>,
#[arg(long, value_name = "PATH")]
pub release_notes_file: Option<PathBuf>,
#[arg(
long,
value_name = "LANG",
default_value = "en-US",
requires = "release_notes_input"
)]
pub release_notes_lang: String,
#[arg(long, value_name = "PATH")]
pub source: Option<PathBuf>,
#[arg(long, hide = true)]
pub internal_root_url: Option<Url>,
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum FirefoxChannelArg {
Listed,
Unlisted,
}
#[derive(Debug, Clone, Copy, ValueEnum)]
pub enum FirefoxApplicationArg {
Firefox,
Android,
}
#[derive(Debug, Args)]
#[command(group(
clap::ArgGroup::new("edge_notes_input")
.multiple(false)
.args(["notes", "notes_file"]),
))]
pub struct EdgeArgs {
#[arg(value_name = "ZIP")]
pub zip: PathBuf,
#[arg(long, env = "WEPUB_EDGE_PRODUCT_ID")]
pub product_id: String,
#[arg(long, env = "WEPUB_EDGE_CLIENT_ID")]
pub client_id: String,
#[arg(long, env = "WEPUB_EDGE_API_KEY")]
pub api_key: String,
#[arg(long)]
pub notes: Option<String>,
#[arg(long, value_name = "PATH")]
pub notes_file: Option<PathBuf>,
}