| //! Checks that types like `::std::option::Option` are not special |
| |
| use structopt::StructOpt; |
| |
| #[rustversion::since(1.37)] |
| #[test] |
| fn special_types_bool() { |
| mod inner { |
| #[allow(non_camel_case_types)] |
| #[derive(PartialEq, Debug)] |
| pub struct bool(pub String); |
| |
| impl std::str::FromStr for self::bool { |
| type Err = String; |
| |
| fn from_str(s: &str) -> Result<Self, Self::Err> { |
| Ok(self::bool(s.into())) |
| } |
| } |
| }; |
| |
| #[derive(StructOpt, PartialEq, Debug)] |
| struct Opt { |
| arg: inner::bool, |
| } |
| |
| assert_eq!( |
| Opt { |
| arg: inner::bool("success".into()) |
| }, |
| Opt::from_iter(&["test", "success"]) |
| ); |
| } |
| |
| #[test] |
| fn special_types_option() { |
| fn parser(s: &str) -> Option<String> { |
| Some(s.to_string()) |
| } |
| |
| #[derive(StructOpt, PartialEq, Debug)] |
| struct Opt { |
| #[structopt(parse(from_str = parser))] |
| arg: ::std::option::Option<String>, |
| } |
| |
| assert_eq!( |
| Opt { |
| arg: Some("success".into()) |
| }, |
| Opt::from_iter(&["test", "success"]) |
| ); |
| } |
| |
| #[test] |
| fn special_types_vec() { |
| fn parser(s: &str) -> Vec<String> { |
| vec![s.to_string()] |
| } |
| |
| #[derive(StructOpt, PartialEq, Debug)] |
| struct Opt { |
| #[structopt(parse(from_str = parser))] |
| arg: ::std::vec::Vec<String>, |
| } |
| |
| assert_eq!( |
| Opt { |
| arg: vec!["success".into()] |
| }, |
| Opt::from_iter(&["test", "success"]) |
| ); |
| } |