OptionParser.parse swallows underscored flags/switches, is this normal or a bug?

Will post my working environment in case I’m doing something or it’s a fixed bug and I don’t know about it:

Erlang/OTP 25 [erts-13.2] [source] [64-bit] [smp:10:10] [ds:10:10:10] [async-threads:1] [jit]

Elixir 1.14.4 (compiled with Erlang/OTP 23)

MacBook Pro M1, Mac OS Ventura, ZSH and ASDF for version control (that’s why Elixir compiled with OTP 23 on an OTP 25)

Current behavior:

iex> OptionParser.parse(["--working-flag", "yes", "--not_working_flag", "5"], switches: [working_flag: :string, not_working_flag: :integer])
{[working_flag: "yes"], ["5"], []}

Expected behavior:

iex> OptionParser.parse(["--working-flag", "yes", "--not_working_flag", "5"], switches: [working_flag: :string, not_working_flag: :integer])
{[working_flag: "yes", not_working_flag: 5], [], []}

As you can see, if I define underscored flags/switches they just go away instead of the expected behavior of being recognized and parsed correctly. Is this a normal behavior? If so I think there should be a warning or something in the documentation (or maybe there is but I don’t see it) to not use underscored switches. In my case I can work around it by just changing switches to dash separated, no big deal but I think this might be a regression or new bug. I wanted to ask here before filing a bug on Elixir’s GitHub

1 Like

Elixir converts switches to underscored atoms, so --source-path becomes :source_path . This is done to better suit Elixir conventions. However, this means that switches can’t contain underscores and switches that do contain underscores are always returned in the list of invalid switches.



:man_facepalming: thanks, I read that too fast and must have missed it, but then… underscored flag should have been returned with the “5” right?

With :switches option it will be always discarded. If you would use :strict options, then it would be returned it in errors list.

1 Like