use std::str::FromStr;
use bodhi::*;
use clap::Parser;
#[derive(Clone, Debug)]
pub enum Format {
JSON,
Plain,
}
impl TryFrom<&str> for Format {
type Error = String;
fn try_from(value: &str) -> Result<Format, String> {
match value.to_lowercase().as_str() {
"json" => Ok(Format::JSON),
"plain" => Ok(Format::Plain),
_ => Err(format!("Not a recognised value for format: {}", &value)),
}
}
}
impl FromStr for Format {
type Err = String;
fn from_str(s: &str) -> Result<Format, String> {
TryFrom::try_from(s)
}
}
#[derive(Debug, Parser)]
#[command(disable_help_subcommand(true))]
#[clap(verbatim_doc_comment)]
pub struct BaseCommand {
#[arg(long)]
pub staging: bool,
#[arg(long, requires("login_url"), conflicts_with("staging"))]
pub bodhi_url: Option<String>,
#[arg(long, requires("bodhi_url"), conflicts_with("staging"))]
pub login_url: Option<String>,
#[arg(long, short = 'n')]
pub no_store_password: bool,
#[arg(long, short = 'k')]
pub ignore_keyring: bool,
#[arg(long, short = 'v')]
pub verbose: bool,
#[command(subcommand)]
pub subcommand: BodhiCommand,
}
#[allow(clippy::large_enum_variant)]
#[derive(Debug, Parser)]
pub enum BodhiCommand {
Comment {
#[arg(long)]
update: String,
#[arg(long)]
text: String,
#[arg(long)]
karma: Option<Karma>,
},
ComposeInfo {
release: FedoraRelease,
request: ComposeRequest,
#[arg(long)]
format: Option<Format>,
},
ComposeList {
#[arg(long)]
format: Option<Format>,
},
CreateOverride {
nvr: String,
#[arg(long)]
duration: u32,
#[arg(long)]
notes: String,
},
CreateUpdateOverride {
alias: String,
#[arg(long)]
duration: u32,
#[arg(long)]
notes: String,
},
CreateUpdate {
#[arg(long)]
autokarma: Option<bool>,
#[arg(long)]
autotime: Option<bool>,
#[arg(long)]
bugs: Option<Vec<u32>>,
#[arg(long, conflicts_with = "from_tag")]
builds: Option<Vec<String>>,
#[arg(long)]
close_bugs: Option<bool>,
#[arg(long)]
display_name: Option<String>,
#[arg(long, conflicts_with = "builds")]
from_tag: Option<String>,
#[arg(long)]
notes: String,
#[arg(long)]
require_bugs: Option<bool>,
#[arg(long)]
require_testcases: Option<bool>,
#[arg(long)]
requirements: Option<Vec<String>>,
#[arg(long)]
severity: Option<UpdateSeverity>,
#[arg(long)]
stable_days: Option<u32>,
#[arg(long)]
stable_karma: Option<i32>,
#[arg(long)]
suggestion: Option<UpdateSuggestion>,
#[arg(long)]
unstable_karma: Option<i32>,
#[arg(long, name = "type")]
update_type: Option<UpdateType>,
},
EditOverride {
nvr: String,
#[arg(long)]
duration: u32,
#[arg(long)]
notes: String,
},
EditUpdate {
alias: String,
#[arg(long)]
add_bugs: Option<Vec<u32>>,
#[arg(long)]
add_builds: Option<Vec<String>>,
#[arg(long)]
autokarma: Option<bool>,
#[arg(long)]
autotime: Option<bool>,
#[arg(long)]
close_bugs: Option<bool>,
#[arg(long)]
display_name: Option<String>,
#[arg(long)]
notes: Option<String>,
#[arg(long)]
remove_bugs: Option<Vec<u32>>,
#[arg(long)]
remove_builds: Option<Vec<String>>,
#[arg(long)]
requirements: Option<Vec<String>>,
#[arg(long)]
severity: Option<UpdateSeverity>,
#[arg(long)]
stable_days: Option<u32>,
#[arg(long)]
stable_karma: Option<i32>,
#[arg(long)]
suggestion: Option<UpdateSuggestion>,
#[arg(long)]
unstable_karma: Option<i32>,
#[arg(long, name = "type")]
update_type: Option<UpdateType>,
},
ExpireOverride {
nvr: String,
},
QueryOverrides {
#[arg(long)]
builds: Option<Vec<String>>,
#[arg(long)]
expired: Option<bool>,
#[arg(long)]
format: Option<Format>,
#[arg(long)]
releases: Option<Vec<FedoraRelease>>,
#[arg(long)]
users: Option<Vec<String>>,
#[arg(long, short)]
force: bool,
},
QueryUpdates {
#[arg(long)]
alias: Option<String>,
#[arg(long)]
bugs: Option<Vec<u32>>,
#[arg(long)]
builds: Option<Vec<String>>,
#[arg(long)]
critpath: Option<bool>,
#[arg(long)]
content_type: Option<ContentType>,
#[arg(long)]
format: Option<Format>,
#[arg(long)]
locked: Option<bool>,
#[arg(long)]
modified_before: Option<BodhiDate>,
#[arg(long)]
modified_since: Option<BodhiDate>,
#[arg(long)]
packages: Option<Vec<String>>,
#[arg(long)]
pushed: Option<bool>,
#[arg(long)]
pushed_before: Option<BodhiDate>,
#[arg(long)]
pushed_since: Option<BodhiDate>,
#[arg(long)]
releases: Option<Vec<FedoraRelease>>,
#[arg(long)]
request: Option<UpdateRequest>,
#[arg(long)]
severity: Option<UpdateSeverity>,
#[arg(long)]
status: Option<UpdateStatus>,
#[arg(long)]
submitted_before: Option<BodhiDate>,
#[arg(long)]
submitted_since: Option<BodhiDate>,
#[arg(long)]
suggestion: Option<UpdateSuggestion>,
#[arg(name = "type", long)]
update_type: Option<UpdateType>,
#[arg(long)]
users: Option<Vec<String>>,
#[arg(long, short)]
force: bool,
},
ReleaseInfo {
release: String,
#[arg(long)]
format: Option<Format>,
},
ReleaseList {
#[arg(long)]
format: Option<Format>,
},
UpdateRequest {
alias: String,
request: UpdateRequest,
},
WaiveTests {
alias: String,
comment: String,
#[arg(long)]
tests: Option<Vec<String>>,
},
}
impl BaseCommand {
pub fn authenticated(&self) -> bool {
use BodhiCommand::*;
match self.subcommand {
Comment { .. } => true,
ComposeInfo { .. } => false,
ComposeList { .. } => false,
CreateOverride { .. } => true,
CreateUpdateOverride { .. } => true,
CreateUpdate { .. } => true,
EditOverride { .. } => true,
EditUpdate { .. } => true,
ExpireOverride { .. } => true,
QueryOverrides { .. } => false,
QueryUpdates { .. } => false,
ReleaseInfo { .. } => false,
ReleaseList { .. } => false,
UpdateRequest { .. } => true,
WaiveTests { .. } => true,
}
}
}