Improve how we indicate that a command arg is optional
This commit is contained in:
committed by
Henrik Friedrichsen
parent
bd80670345
commit
4942647e1c
@@ -320,10 +320,22 @@ fn handle_aliases(input: &str) -> &str {
|
|||||||
|
|
||||||
#[derive(Clone, Serialize, Deserialize, Debug)]
|
#[derive(Clone, Serialize, Deserialize, Debug)]
|
||||||
pub enum CommandParseError {
|
pub enum CommandParseError {
|
||||||
NoSuchCommand { cmd: String },
|
NoSuchCommand {
|
||||||
InsufficientArgs { cmd: String, hint: Option<String> },
|
cmd: String,
|
||||||
BadEnumArg { arg: String, accept: Vec<String> },
|
},
|
||||||
ArgParseError { arg: String, err: String },
|
InsufficientArgs {
|
||||||
|
cmd: String,
|
||||||
|
hint: Option<String>,
|
||||||
|
},
|
||||||
|
BadEnumArg {
|
||||||
|
arg: String,
|
||||||
|
accept: Vec<String>,
|
||||||
|
optional: bool,
|
||||||
|
},
|
||||||
|
ArgParseError {
|
||||||
|
arg: String,
|
||||||
|
err: String,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for CommandParseError {
|
impl fmt::Display for CommandParseError {
|
||||||
@@ -338,12 +350,17 @@ impl fmt::Display for CommandParseError {
|
|||||||
format!("\"{cmd}\" requires additional arguments")
|
format!("\"{cmd}\" requires additional arguments")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
BadEnumArg { arg, accept } => {
|
BadEnumArg {
|
||||||
format!(
|
arg,
|
||||||
"Illegal argument \"{}\": supported values are {}",
|
accept,
|
||||||
arg,
|
optional,
|
||||||
accept.join("|")
|
} => {
|
||||||
)
|
let accept = accept.join("|");
|
||||||
|
if *optional {
|
||||||
|
format!("Argument \"{arg}\" should be one of {accept} or be omitted")
|
||||||
|
} else {
|
||||||
|
format!("Argument \"{arg}\" should be one of {accept}")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ArgParseError { arg, err } => format!("Error with argument \"{arg}\": {err}"),
|
ArgParseError { arg, err } => format!("Error with argument \"{arg}\": {err}"),
|
||||||
};
|
};
|
||||||
@@ -399,7 +416,8 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
Some("current") => Ok(Command::AddCurrent),
|
Some("current") => Ok(Command::AddCurrent),
|
||||||
Some(arg) => Err(BadEnumArg {
|
Some(arg) => Err(BadEnumArg {
|
||||||
arg: arg.into(),
|
arg: arg.into(),
|
||||||
accept: vec!["**omit**".into(), "queue".into()],
|
accept: vec!["current".into()],
|
||||||
|
optional: true,
|
||||||
}),
|
}),
|
||||||
None => Ok(Command::Add),
|
None => Ok(Command::Add),
|
||||||
}?,
|
}?,
|
||||||
@@ -408,7 +426,8 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
Some("current") => Ok(Command::SaveCurrent),
|
Some("current") => Ok(Command::SaveCurrent),
|
||||||
Some(arg) => Err(BadEnumArg {
|
Some(arg) => Err(BadEnumArg {
|
||||||
arg: arg.into(),
|
arg: arg.into(),
|
||||||
accept: vec!["**omit**".into(), "queue".into()],
|
accept: vec!["queue".into(), "current".into()],
|
||||||
|
optional: true,
|
||||||
}),
|
}),
|
||||||
None => Ok(Command::Save),
|
None => Ok(Command::Save),
|
||||||
}?,
|
}?,
|
||||||
@@ -500,7 +519,6 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
Some(arg) => Err(BadEnumArg {
|
Some(arg) => Err(BadEnumArg {
|
||||||
arg: arg.into(),
|
arg: arg.into(),
|
||||||
accept: vec![
|
accept: vec![
|
||||||
"**omit**".into(),
|
|
||||||
"list".into(),
|
"list".into(),
|
||||||
"playlist".into(),
|
"playlist".into(),
|
||||||
"queue".into(),
|
"queue".into(),
|
||||||
@@ -510,6 +528,7 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
"none".into(),
|
"none".into(),
|
||||||
"off".into(),
|
"off".into(),
|
||||||
],
|
],
|
||||||
|
optional: true,
|
||||||
}),
|
}),
|
||||||
None => Ok(None),
|
None => Ok(None),
|
||||||
}?;
|
}?;
|
||||||
@@ -521,7 +540,8 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
Some("off") => Ok(Some(false)),
|
Some("off") => Ok(Some(false)),
|
||||||
Some(arg) => Err(BadEnumArg {
|
Some(arg) => Err(BadEnumArg {
|
||||||
arg: arg.into(),
|
arg: arg.into(),
|
||||||
accept: vec!["**omit**".into(), "on".into(), "off".into()],
|
accept: vec!["on".into(), "off".into()],
|
||||||
|
optional: true,
|
||||||
}),
|
}),
|
||||||
None => Ok(None),
|
None => Ok(None),
|
||||||
}?;
|
}?;
|
||||||
@@ -539,6 +559,7 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
_ => Err(BadEnumArg {
|
_ => Err(BadEnumArg {
|
||||||
arg: target_mode_raw.into(),
|
arg: target_mode_raw.into(),
|
||||||
accept: vec!["selected".into(), "current".into()],
|
accept: vec!["selected".into(), "current".into()],
|
||||||
|
optional: false,
|
||||||
}),
|
}),
|
||||||
}?;
|
}?;
|
||||||
Command::Share(target_mode)
|
Command::Share(target_mode)
|
||||||
@@ -555,6 +576,7 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
_ => Err(BadEnumArg {
|
_ => Err(BadEnumArg {
|
||||||
arg: target_mode_raw.into(),
|
arg: target_mode_raw.into(),
|
||||||
accept: vec!["selected".into(), "current".into()],
|
accept: vec!["selected".into(), "current".into()],
|
||||||
|
optional: false,
|
||||||
}),
|
}),
|
||||||
}?;
|
}?;
|
||||||
Command::Open(target_mode)
|
Command::Open(target_mode)
|
||||||
@@ -570,6 +592,7 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
_ => Err(BadEnumArg {
|
_ => Err(BadEnumArg {
|
||||||
arg: goto_mode_raw.into(),
|
arg: goto_mode_raw.into(),
|
||||||
accept: vec!["album".into(), "artist".into()],
|
accept: vec!["album".into(), "artist".into()],
|
||||||
|
optional: false,
|
||||||
}),
|
}),
|
||||||
}?;
|
}?;
|
||||||
Command::Goto(goto_mode)
|
Command::Goto(goto_mode)
|
||||||
@@ -604,6 +627,7 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
"left".into(),
|
"left".into(),
|
||||||
"right".into(),
|
"right".into(),
|
||||||
],
|
],
|
||||||
|
optional: false,
|
||||||
}),
|
}),
|
||||||
}?
|
}?
|
||||||
};
|
};
|
||||||
@@ -651,6 +675,7 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
_ => Err(BadEnumArg {
|
_ => Err(BadEnumArg {
|
||||||
arg: shift_dir_raw.into(),
|
arg: shift_dir_raw.into(),
|
||||||
accept: vec!["up".into(), "down".into()],
|
accept: vec!["up".into(), "down".into()],
|
||||||
|
optional: false,
|
||||||
}),
|
}),
|
||||||
}?;
|
}?;
|
||||||
let amount = match args.get(1) {
|
let amount = match args.get(1) {
|
||||||
@@ -722,24 +747,24 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
"added".into(),
|
"added".into(),
|
||||||
"artist".into(),
|
"artist".into(),
|
||||||
],
|
],
|
||||||
|
optional: false,
|
||||||
}),
|
}),
|
||||||
}?;
|
}?;
|
||||||
let direction = match args.get(1) {
|
let direction = match args.get(1).copied() {
|
||||||
Some(&direction_raw) => match direction_raw {
|
Some("a" | "asc" | "ascending") => Ok(SortDirection::Ascending),
|
||||||
"a" | "asc" | "ascending" => Ok(SortDirection::Ascending),
|
Some("d" | "desc" | "descending") => Ok(SortDirection::Descending),
|
||||||
"d" | "desc" | "descending" => Ok(SortDirection::Descending),
|
Some(direction_raw) => Err(BadEnumArg {
|
||||||
_ => Err(BadEnumArg {
|
arg: direction_raw.into(),
|
||||||
arg: direction_raw.into(),
|
accept: vec![
|
||||||
accept: vec![
|
"a".into(),
|
||||||
"a".into(),
|
"asc".into(),
|
||||||
"asc".into(),
|
"ascending".into(),
|
||||||
"ascending".into(),
|
"d".into(),
|
||||||
"d".into(),
|
"desc".into(),
|
||||||
"desc".into(),
|
"descending".into(),
|
||||||
"descending".into(),
|
],
|
||||||
],
|
optional: true,
|
||||||
}),
|
}),
|
||||||
},
|
|
||||||
None => Ok(SortDirection::Ascending),
|
None => Ok(SortDirection::Ascending),
|
||||||
}?;
|
}?;
|
||||||
Command::Sort(key, direction)
|
Command::Sort(key, direction)
|
||||||
@@ -756,6 +781,7 @@ pub fn parse(input: &str) -> Result<Vec<Command>, CommandParseError> {
|
|||||||
_ => Err(BadEnumArg {
|
_ => Err(BadEnumArg {
|
||||||
arg: target_mode_raw.into(),
|
arg: target_mode_raw.into(),
|
||||||
accept: vec!["selected".into(), "current".into()],
|
accept: vec!["selected".into(), "current".into()],
|
||||||
|
optional: false,
|
||||||
}),
|
}),
|
||||||
}?;
|
}?;
|
||||||
Command::ShowRecommendations(target_mode)
|
Command::ShowRecommendations(target_mode)
|
||||||
|
|||||||
Reference in New Issue
Block a user