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