#[cfg(feature = "codespan-reporting")] #[test] fn codespan_report() { let toml = r#" [general] conf_file_param = "foo" conf_dir_param = "foo" skip_default_conf_files_switch = "help" [[param]] name = "bar" type = "bool" default = "false" abbr = "x" optional = false [[switch]] name = "foo" abbr = "x" [[switch]] name = "foo" abbr = "x" [[switch]] name = "baz" abbr = "-" [[switch]] name = "0foo" [[switch]] name = "-foo" [[switch]] name = "foo-bar" [[switch]] name = "1a=bit**loong and ###weird@parameter" [[switch]] name = "-a=bit**loong and ###weird@parameter" [[switch]] name = "a=bit**loong and ###weird@parameter" "#; let expected = r#"invalid config specification: error: the option `foo` appears more than once ┌─ unknown file:4:26 │ 3 │ conf_file_param = "foo" │ ----- the option was first defined here 4 │ conf_dir_param = "foo" │ ^^^^^ the option is repeated here · 15 │ name = "foo" │ ^^^^^ ... and here · 19 │ name = "foo" │ ^^^^^ ... and here error: use of reserved option ┌─ unknown file:5:42 │ 5 │ skip_default_conf_files_switch = "help" │ ^^^^^^ this option is reserved because it's always implemented by `configure_me` error: parameter attempts to be both optional and mandatory at the same time ┌─ unknown file:10:19 │ 8 │ name = "bar" │ ----- in the parameter `bar` 9 │ type = "bool" 10 │ default = "false" │ ^^^^^^^ the default value is provided here making the parameter optional 11 │ abbr = "x" 12 │ optional = false │ ^^^^^ setting `optional` to `false` makes the parameter mandatory here │ = Help: either make the parameter optional or remove the default value error: the option `x` appears more than once ┌─ unknown file:16:16 │ 11 │ abbr = "x" │ --- the option was first defined here · 16 │ abbr = "x" │ ^^^ the option is repeated here · 20 │ abbr = "x" │ ^^^ ... and here error: invalid short option ┌─ unknown file:24:16 │ 23 │ name = "baz" │ ----- in this field 24 │ abbr = "-" │ ^^^ this option uses an invalid character │ = Note: only English letters (both lower case and upper case) are allowed error: the identifier `0foo` contains an invalid character ┌─ unknown file:27:17 │ 27 │ name = "0foo" │ ^ the identifier starts with a digit │ = Help: identifiers mut not start with digits error: the identifier `-foo` contains an invalid character ┌─ unknown file:30:17 │ 30 │ name = "-foo" │ ^ this char is invalid │ = Help: dashes are prepended automatically, you don't need to write them error: the identifier `foo-bar` contains an invalid character ┌─ unknown file:33:20 │ 33 │ name = "foo-bar" │ ^ this char is invalid │ = Help: consider replacing dashes with underscores. They will be replaced with dashes in command line parameters but stay underscores in config files. error: the identifier `1a=bit**loong and ###weird@parameter` contains invalid characters ┌─ unknown file:36:17 │ 36 │ name = "1a=bit**loong and ###weird@parameter" │ ^ ^ ^^ ^^^ ^^^^ ^ ... and this char │ │ │ │ │ │ │ │ │ │ │ ... and these chars │ │ │ │ ... and these chars │ │ │ ... and these chars │ │ this char is invalid │ the identifier starts with a digit │ = Help: identifiers mut not start with digits error: the identifier `-a=bit**loong and ###weird@parameter` contains invalid characters ┌─ unknown file:39:17 │ 39 │ name = "-a=bit**loong and ###weird@parameter" │ ^ ^ ^^ ^^^ ^^^^ ^ ... and this char │ │ │ │ │ │ │ │ │ │ │ ... and these chars │ │ │ │ ... and these chars │ │ │ ... and these chars │ │ ... and this char │ this char is invalid │ = Help: dashes are prepended automatically, you don't need to write them error: the identifier `a=bit**loong and ###weird@parameter` contains invalid characters ┌─ unknown file:42:18 │ 42 │ name = "a=bit**loong and ###weird@parameter" │ ^ ^^ ^^^ ^^^^ ^ ... and this char │ │ │ │ │ │ │ │ │ ... and these chars │ │ │ ... and these chars │ │ ... and these chars │ this char is invalid "#; let error_messages = format!("{:?}", configure_me_codegen::generate_source(toml.as_bytes(), std::io::sink()).unwrap_err()); assert_eq!(error_messages, expected); }