use crate::{
version::{Operator, SetTypes, VersionFile},
VersionError,
};
use clap::{builder::RangedU64ValueParser, Args, Subcommand};
#[derive(Args, Debug, Clone)]
pub struct Set {
#[arg(value_parser = RangedU64ValueParser::<u8>::new(), exclusive = true)]
pub value: Option<u8>,
#[command(subcommand)]
pub command: Option<UpDown>,
}
impl Set {
pub fn run(&self, version: &mut VersionFile) -> Result<(), VersionError> {
if let Some(value) = &self.value {
version.operator = Some(Operator::Set(SetTypes::Number(*value)));
version.run()
} else if let Some(command) = &self.command {
command.run(version)
} else {
Err(VersionError::NoValue)
}
}
}
#[derive(Subcommand, Debug, Clone)]
#[command(rename_all = "lower", arg_required_else_help(true))]
pub enum UpDown {
#[command(name = "+")]
Up,
#[command(name = "-")]
Down,
}
impl UpDown {
pub fn run(&self, version: &mut VersionFile) -> Result<(), VersionError> {
match self {
UpDown::Up => {
version.operator = Some(Operator::Set(SetTypes::AddNumber));
version.run()
}
UpDown::Down => {
version.operator = Some(Operator::Set(SetTypes::SubNumber));
version.run()
}
}
}
}