use crate::{VersionError, version::SetTypes};
use clap::{Args, Subcommand, builder::RangedU64ValueParser};
#[derive(Args, Debug, Clone, PartialEq)]
pub struct Set {
#[arg(value_parser = RangedU64ValueParser::<u64>::new(), exclusive = true)]
pub value: Option<u64>,
#[command(subcommand)]
pub command: Option<UpDown>,
}
impl TryFrom<&Set> for SetTypes {
type Error = VersionError;
fn try_from(set: &Set) -> Result<Self, VersionError> {
if let Some(value) = &set.value {
return Ok(SetTypes::Number(*value));
} else if let Some(command) = &set.command {
return Ok(command.try_into()?);
} else {
Err(VersionError::NoValue)
}
}
}
impl TryFrom<Set> for SetTypes {
type Error = VersionError;
fn try_from(set: Set) -> Result<Self, VersionError> {
if let Some(value) = &set.value {
return Ok(SetTypes::Number(*value));
} else if let Some(command) = &set.command {
return Ok(command.try_into()?);
} else {
Err(VersionError::NoValue)
}
}
}
#[derive(Subcommand, Debug, Clone, PartialEq)]
#[command(rename_all = "lower", arg_required_else_help(true))]
pub enum UpDown {
#[command(name = "+")]
Plus,
#[command(name = "-")]
Minus,
Up,
Down,
}
impl TryFrom<&UpDown> for SetTypes {
type Error = VersionError;
fn try_from(updown: &UpDown) -> Result<Self, VersionError> {
match updown {
UpDown::Up => Ok(SetTypes::AddNumber),
UpDown::Down => Ok(SetTypes::SubNumber),
UpDown::Plus => Ok(SetTypes::AddNumber),
UpDown::Minus => Ok(SetTypes::SubNumber),
}
}
}
impl TryFrom<UpDown> for SetTypes {
type Error = VersionError;
fn try_from(updown: UpDown) -> Result<Self, VersionError> {
match updown {
UpDown::Up => Ok(SetTypes::AddNumber),
UpDown::Down => Ok(SetTypes::SubNumber),
UpDown::Plus => Ok(SetTypes::AddNumber),
UpDown::Minus => Ok(SetTypes::SubNumber),
}
}
}