Skip to content

Commit 59e2de5

Browse files
committed
Boolean flags can have values passed
- boolean flags can have values passed in as "true" or "false" (case insensitively). - add tests
1 parent 58934c4 commit 59e2de5

File tree

1 file changed

+50
-118
lines changed

1 file changed

+50
-118
lines changed

src/lib.rs

Lines changed: 50 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,10 @@ impl FlagSet {
277277
if TypeId::of::<bool>() == value_type {
278278
if arg.eq_ignore_ascii_case("true") || arg.eq_ignore_ascii_case("false")
279279
{
280-
self.set_flag_value_unparsed(&flag_name, arg.clone());
280+
self.set_flag_value_unparsed(
281+
&flag_name,
282+
arg.clone().to_lowercase(),
283+
);
281284
} else {
282285
return Err(FlagError {
283286
error_type: FlagErrorKind::UsageError,
@@ -565,121 +568,50 @@ mod tests {
565568
let _rval = retry_flag.borrow().get_value::<i32>().unwrap();
566569
}
567570

568-
// #[test]
569-
// fn test_short_flag_added() {
570-
// let mut flagset = FlagSet::new();
571-
// let tflag = Flag::new(
572-
// Some('b'),
573-
// None,
574-
// "path to the directory that can hold the backup files",
575-
// Some("/root/backup/10102022".to_string()),
576-
// true,
577-
// );
578-
// flagset.add(tflag);
579-
// assert_eq!(flagset.is_known_flag("b"), true);
580-
// }
581-
582-
// #[test]
583-
// fn test_add_multiple_flags() {
584-
// // let bflag = Flag::new(
585-
// // Some('b'),
586-
// // None,
587-
// // "path to the directory that can hold the backup files",
588-
// // Some("/root/backup/10102022".to_string()),
589-
// // true,
590-
// // );
591-
// let iflag = Flag::new(
592-
// Some('i'),
593-
// Some("ignore-case"),
594-
// "case insensitive search",
595-
// Some(false),
596-
// false,
597-
// );
598-
//
599-
// let mut flagset = FlagSet::new();
600-
// flagset.add(iflag);
601-
// assert_eq!(flagset.is_known_flag("ignore-case"), true);
602-
// }
603-
604-
// #[test]
605-
// #[should_panic(expected = "required: short name or long name")]
606-
// fn test_with_no_flagnames() {
607-
// let choice = FlagValue::Choice(false);
608-
// let mut flagset = FlagSet::new();
609-
// let iflag = Flag::new(None, None, "case insensitive", None, false, choice);
610-
// flagset.add(iflag);
611-
// }
612-
//
613-
// #[test]
614-
// fn test_formatter_both_flags() {
615-
// let choice = FlagValue::Choice(false);
616-
// let iflag = Flag::new(
617-
// Some('i'),
618-
// Some("case-insensitive"),
619-
// "case insensitive",
620-
// None,
621-
// false,
622-
// choice,
623-
// );
624-
// assert_eq!(
625-
// format!("{}", iflag),
626-
// "-i --case-insensitive case insensitive"
627-
// )
628-
// }
629-
//
630-
// #[test]
631-
// fn test_formatter_shortflag_only() {
632-
// let choice = FlagValue::Choice(false);
633-
// let iflag = Flag::new(Some('i'), None, "case insensitive", None, false, choice);
634-
// assert_eq!(format!("{}", iflag), "-i case insensitive")
635-
// }
636-
637-
// #[test]
638-
// fn test_formatter_longflag_only() {
639-
// let choice = FlagValue::Choice(false);
640-
// let iflag = Flag::new(
641-
// None,
642-
// Some("case-insensitive"),
643-
// "case insensitive",
644-
// None,
645-
// false,
646-
// choice,
647-
// );
648-
// assert_eq!(format!("{}", iflag), "--case-insensitive case insensitive")
649-
// }
650-
651-
// #[test]
652-
// fn test_flag_default_value() {
653-
// let a_number = FlagValue::I32(0);
654-
// let retry_flag = Flag::new(
655-
// Some('r'),
656-
// Some("retry"),
657-
// "number of times to retry",
658-
// Some(FlagValue::I32(3)),
659-
// false,
660-
// a_number.clone(),
661-
// );
662-
// let timeout_flag = Flag::new(
663-
// Some('t'),
664-
// Some("timeout"),
665-
// "timeout in seconds",
666-
// Some(FlagValue::I32(10)),
667-
// false,
668-
// a_number.clone(),
669-
// );
670-
// let mut flagset = FlagSet::new();
671-
// flagset.add(retry_flag);
672-
// flagset.add(timeout_flag);
673-
// match flagset.value_of("retry") {
674-
// Ok(v) => match v {
675-
// Some(flag_value) => {
676-
// assert_eq!(flag_value, &FlagValue::I32(3));
677-
// }
678-
// None => {
679-
// assert_eq!(true, false, "Flag value not found");
680-
// }
681-
// },
682-
// Err(_) => {}
683-
// }
684-
// }
571+
#[test]
572+
#[should_panic(expected = "flag value type does not match")]
573+
fn read_flag_with_different_kind_must_panic() {
574+
let retry_flag = Flag::new(
575+
Some("-r"),
576+
Some("--retry"),
577+
"number of retry operations",
578+
false,
579+
Flag::kind::<i32>(),
580+
Some(Box::new(5i32)),
581+
);
582+
let mut flagset = FlagSet::new();
583+
flagset.add(&retry_flag);
584+
let args: Vec<&str> = vec!["--retry 10"];
585+
let args = args.iter().map(|s| s.to_string()).collect::<Vec<String>>();
586+
assert_eq!(flagset.parse_args(args).err().is_none(), true);
587+
// reading i32 as f64 will panic
588+
let _rval = retry_flag.borrow().get_value::<f64>().unwrap();
589+
}
590+
591+
#[test]
592+
fn cmdarg_boolean_values_can_also_have_true_false() {
593+
let force_flag = Flag::new(
594+
Some("-f"),
595+
Some("--force"),
596+
"force the operation",
597+
false,
598+
Flag::kind::<bool>(),
599+
Some(Box::new(false)),
600+
);
601+
let mut flagset = FlagSet::new();
602+
flagset.add(&force_flag);
603+
let args = vec!["-f", "True"];
604+
let args = args.iter().map(|s| s.to_string()).collect::<Vec<String>>();
605+
match flagset.parse_args(args).err() {
606+
Some(e) => {
607+
assert_eq!("", e.message, "unexpected error: flags are correct");
608+
}
609+
None => {}
610+
}
611+
let fval = force_flag
612+
.borrow()
613+
.get_value::<bool>()
614+
.expect("expect default value");
615+
assert_eq!(fval, true);
616+
}
685617
}

0 commit comments

Comments
 (0)