File 6139-handle-args-passed-as-binaries.patch of Package erlang
From 202695bc1a5b139e6b11a3374e1b955eb55d0988 Mon Sep 17 00:00:00 2001
From: Julian Doherty <julian@juliandoherty.com>
Date: Sat, 12 Oct 2024 16:30:10 +1100
Subject: [PATCH 2/3] handle args passed as binaries
---
lib/stdlib/src/argparse.erl | 3 ++-
lib/stdlib/test/argparse_SUITE.erl | 25 +++++++++++++++++++++++--
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/lib/stdlib/src/argparse.erl b/lib/stdlib/src/argparse.erl
index 93fbaa3b49..293850d657 100644
--- a/lib/stdlib/src/argparse.erl
+++ b/lib/stdlib/src/argparse.erl
@@ -727,8 +727,9 @@ parse(Args, Command, Options) ->
Prog = validate(Command, Options),
%% use maps and not sets v2, because sets:is_element/2 cannot be used in guards (unlike is_map_key)
Prefixes = maps:from_list([{P, true} || P <- maps:get(prefixes, Options, [$-])]),
+ Args2 = [unicode:characters_to_list(Arg) || Arg <- Args],
try
- parse_impl(Args, merge_arguments(Prog, Command, init_parser(Prefixes, Command, Options)))
+ parse_impl(Args2, merge_arguments(Prog, Command, init_parser(Prefixes, Command, Options)))
catch
%% Parser error may happen at any depth, and bubbling the error is really
%% cumbersome. Use exceptions and catch it before returning from `parse/2,3' instead.
diff --git a/lib/stdlib/test/argparse_SUITE.erl b/lib/stdlib/test/argparse_SUITE.erl
index 01f39ef540..db7e265eb4 100644
--- a/lib/stdlib/test/argparse_SUITE.erl
+++ b/lib/stdlib/test/argparse_SUITE.erl
@@ -23,6 +23,7 @@
-export([
readme/0, readme/1,
basic/0, basic/1,
+ binary_args/0, binary_args/1,
long_form_eq/0, long_form_eq/1,
built_in_types/0, built_in_types/1,
type_validators/0, type_validators/1,
@@ -55,6 +56,7 @@
validator_exception_format/0, validator_exception_format/1,
run_handle/0, run_handle/1,
+ run_handle_binary_args/0, run_handle_binary_args/1,
run_args_ordering/0, run_args_ordering/1
]).
@@ -66,7 +68,7 @@ suite() ->
groups() ->
[
{parser, [parallel], [
- readme, basic, long_form_eq, built_in_types, type_validators,
+ readme, basic, binary_args, long_form_eq, built_in_types, type_validators,
invalid_arguments, complex_command, unicode, parser_error,
nargs, argparse, negative, nodigits, pos_mixed_with_opt,
default_for_not_required, global_default, subcommand,
@@ -80,7 +82,7 @@ groups() ->
validator_exception, validator_exception_format
]},
{run, [parallel], [
- run_handle, run_args_ordering
+ run_handle, run_handle_binary_args, run_args_ordering
]}
].
@@ -228,6 +230,15 @@ basic(Config) when is_list(Config) ->
?assertEqual({ok, #{arg => [true, false]}, [Prog], ArgListCmd},
parse(["true false"], ArgListCmd)).
+binary_args() ->
+ [{doc, "Args are provided as binarys"}].
+
+binary_args(Config) when is_list(Config) ->
+ %% no command, just argument list
+ KernelCmd = #{arguments => [#{name => kernel, long => "kernel", type => atom, nargs => 2}]},
+ ?assertEqual({ok, #{kernel => [port, dist]}, [prog()], KernelCmd},
+ argparse:parse([<<"-kernel">>, <<"port">>, <<"dist">>], KernelCmd)).
+
long_form_eq() ->
[{doc, "Tests that long form supports --arg=value"}].
@@ -1128,6 +1139,16 @@ run_handle(Config) when is_list(Config) ->
arguments => [#{name => arg}]}}},
#{})).
+run_handle_binary_args() ->
+ [{doc, "Verify that argparse:run/3, accepts binary args"}].
+
+run_handle_binary_args(Config) when is_list(Config) ->
+ %% no subcommand, positional module-based function
+ ?assertEqual(6,
+ argparse:run([<<"2">>, <<"3">>], #{handler => {erlang, '*', undefined},
+ arguments => [#{name => l, type => integer}, #{name => r, type => integer}]},
+ #{})).
+
run_args_ordering() ->
[{doc, "Test that positional arguments are parsed in the correct order"}].
--
2.43.0