Skip to content

Commit af653fd

Browse files
Refactor (#183)
* Make Param.name immutable * Use RawParam in parsing
1 parent 6e2e25b commit af653fd

File tree

6 files changed

+91
-75
lines changed

6 files changed

+91
-75
lines changed

source/argparse/internal/arguments.d

Lines changed: 39 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ module argparse.internal.arguments;
33
import argparse.internal.lazystring;
44

55
import argparse.config;
6+
import argparse.param;
67
import argparse.result;
78

89
import std.typecons: Nullable;
@@ -36,23 +37,23 @@ package(argparse) struct ArgumentInfo
3637
Nullable!size_t minValuesCount;
3738
Nullable!size_t maxValuesCount;
3839

39-
auto checkValuesCount(const Config config, string argName, size_t count) const
40+
auto checkValuesCount(const ref RawParam param) const
4041
{
4142
immutable min = minValuesCount.get;
4243
immutable max = maxValuesCount.get;
4344

4445
// override for boolean flags
45-
if(isBooleanFlag && count == 1)
46+
if(isBooleanFlag && param.value.length == 1)
4647
return Result.Success;
4748

48-
if(min == max && count != min)
49-
return Result.Error("Argument '",config.styling.argumentName(argName),"': expected ",min,min == 1 ? " value" : " values");
49+
if(min == max && param.value.length != min)
50+
return Result.Error("Argument '",param.config.styling.argumentName(param.name),"': expected ",min,min == 1 ? " value" : " values");
5051

51-
if(count < min)
52-
return Result.Error("Argument '",config.styling.argumentName(argName),"': expected at least ",min,min == 1 ? " value" : " values");
52+
if(param.value.length < min)
53+
return Result.Error("Argument '",param.config.styling.argumentName(param.name),"': expected at least ",min,min == 1 ? " value" : " values");
5354

54-
if(count > max)
55-
return Result.Error("Argument '",config.styling.argumentName(argName),"': expected at most ",max,max == 1 ? " value" : " values");
55+
if(param.value.length > max)
56+
return Result.Error("Argument '",param.config.styling.argumentName(param.name),"': expected at most ",max,max == 1 ? " value" : " values");
5657

5758
return Result.Success;
5859
}
@@ -70,28 +71,36 @@ unittest
7071
return info;
7172
}
7273

73-
assert(info(2,4).checkValuesCount(Config.init, "", 1).isError("expected at least 2 values"));
74-
assert(info(2,4).checkValuesCount(Config.init, "", 2));
75-
assert(info(2,4).checkValuesCount(Config.init, "", 3));
76-
assert(info(2,4).checkValuesCount(Config.init, "", 4));
77-
assert(info(2,4).checkValuesCount(Config.init, "", 5).isError("expected at most 4 values"));
78-
79-
assert(info(2,2).checkValuesCount(Config.init, "", 1).isError("expected 2 values"));
80-
assert(info(2,2).checkValuesCount(Config.init, "", 2));
81-
assert(info(2,2).checkValuesCount(Config.init, "", 3).isError("expected 2 values"));
82-
83-
assert(info(1,1).checkValuesCount(Config.init, "", 0).isError("expected 1 value"));
84-
assert(info(1,1).checkValuesCount(Config.init, "", 1));
85-
assert(info(1,1).checkValuesCount(Config.init, "", 2).isError("expected 1 value"));
86-
87-
assert(info(0,1).checkValuesCount(Config.init, "", 0));
88-
assert(info(0,1).checkValuesCount(Config.init, "", 1));
89-
assert(info(0,1).checkValuesCount(Config.init, "", 2).isError("expected at most 1 value"));
90-
91-
assert(info(1,2).checkValuesCount(Config.init, "", 0).isError("expected at least 1 value"));
92-
assert(info(1,2).checkValuesCount(Config.init, "", 1));
93-
assert(info(1,2).checkValuesCount(Config.init, "", 2));
94-
assert(info(1,2).checkValuesCount(Config.init, "", 3).isError("expected at most 2 values"));
74+
Config config;
75+
auto p0 = RawParam(&config, "", []);
76+
auto p1 = RawParam(&config, "", ["",]);
77+
auto p2 = RawParam(&config, "", ["","",]);
78+
auto p3 = RawParam(&config, "", ["","","",]);
79+
auto p4 = RawParam(&config, "", ["","","","",]);
80+
auto p5 = RawParam(&config, "", ["","","","","",]);
81+
82+
assert(info(2,4).checkValuesCount(p1).isError("expected at least 2 values"));
83+
assert(info(2,4).checkValuesCount(p2));
84+
assert(info(2,4).checkValuesCount(p3));
85+
assert(info(2,4).checkValuesCount(p4));
86+
assert(info(2,4).checkValuesCount(p5).isError("expected at most 4 values"));
87+
88+
assert(info(2,2).checkValuesCount(p1).isError("expected 2 values"));
89+
assert(info(2,2).checkValuesCount(p2));
90+
assert(info(2,2).checkValuesCount(p3).isError("expected 2 values"));
91+
92+
assert(info(1,1).checkValuesCount(p0).isError("expected 1 value"));
93+
assert(info(1,1).checkValuesCount(p1));
94+
assert(info(1,1).checkValuesCount(p2).isError("expected 1 value"));
95+
96+
assert(info(0,1).checkValuesCount(p0));
97+
assert(info(0,1).checkValuesCount(p1));
98+
assert(info(0,1).checkValuesCount(p2).isError("expected at most 1 value"));
99+
100+
assert(info(1,2).checkValuesCount(p0).isError("expected at least 1 value"));
101+
assert(info(1,2).checkValuesCount(p1));
102+
assert(info(1,2).checkValuesCount(p2));
103+
assert(info(1,2).checkValuesCount(p3).isError("expected at most 2 values"));
95104
}
96105

97106
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

source/argparse/internal/argumentuda.d

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,19 @@ package(argparse) struct ArgumentUDA(ValueParser)
1818

1919
package(argparse) ValueParser valueParser;
2020

21-
package Result parse(COMMAND_STACK, RECEIVER)(const Config config, const COMMAND_STACK cmdStack, ref RECEIVER receiver, string argName, string[] rawValues)
21+
package Result parse(COMMAND_STACK, RECEIVER)(const COMMAND_STACK cmdStack, ref RECEIVER receiver, RawParam param)
2222
{
2323
try
2424
{
25-
auto res = info.checkValuesCount(config, argName, rawValues.length);
25+
auto res = info.checkValuesCount(param);
2626
if(!res)
2727
return res;
2828

29-
return valueParser.parseParameter(receiver, RawParam(&config, argName, rawValues));
29+
return valueParser.parseParameter(receiver, param);
3030
}
3131
catch(Exception e)
3232
{
33-
return Result.Error("Argument '", config.styling.argumentName(argName), ": ", e.msg);
33+
return Result.Error("Argument '", param.config.styling.argumentName(param.name), ": ", e.msg);
3434
}
3535
}
3636

source/argparse/internal/command.d

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -41,23 +41,24 @@ package struct SubCommands
4141

4242
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
4343

44-
private Result ArgumentParsingFunction(Config config, alias uda, RECEIVER)(const Command[] cmdStack,
45-
ref RECEIVER receiver,
46-
string argName,
47-
string[] rawValues)
44+
private Result ArgumentParsingFunction(alias uda, RECEIVER)(const Command[] cmdStack,
45+
ref RECEIVER receiver,
46+
ref RawParam param)
4847
{
4948
static if(uda.info.memberSymbol)
5049
auto target = &__traits(getMember, receiver, uda.info.memberSymbol);
5150
else
5251
auto target = null;
5352

54-
return uda.parse(config, cmdStack, target, argName, rawValues);
53+
return uda.parse(cmdStack, target, param);
5554
}
5655

57-
private Result ArgumentCompleteFunction(Config config, alias uda, RECEIVER)(const Command[] cmdStack,
58-
ref RECEIVER receiver,
59-
string argName,
60-
string[] rawValues)
56+
private alias getArgumentParsingFunction1(alias uda) =
57+
(const Command[] cmdStack, ref RawParam param) => ArgumentParsingFunction!uda(cmdStack, receiver, param);
58+
59+
private Result ArgumentCompleteFunction(alias uda, RECEIVER)(const Command[] cmdStack,
60+
ref RECEIVER receiver,
61+
ref RawParam param)
6162
{
6263
return Result.Success;
6364
}
@@ -70,10 +71,12 @@ unittest
7071
auto test(string[] values)
7172
{
7273
T t;
74+
Config cfg;
75+
auto param = RawParam(&cfg, "a", values);
7376

7477
enum uda = getMemberArgumentUDA!(T, "a")(Config.init);
7578

76-
return ArgumentParsingFunction!(Config.init, uda)([], t, "a", values);
79+
return ArgumentParsingFunction!uda([], t, param);
7780
}
7881

7982
assert(test(["raw-value"]));
@@ -88,19 +91,21 @@ unittest
8891
}
8992

9093
T t;
94+
Config cfg;
95+
auto param = RawParam(&cfg, "func", []);
9196

9297
enum uda = getMemberArgumentUDA!(T, "func")(Config.init);
9398

94-
auto res = ArgumentParsingFunction!(Config.init, uda)([], t, "func", []);
99+
auto res = ArgumentParsingFunction!uda([], t, param);
95100

96-
assert(res.isError(Config.init.styling.argumentName("func")~": My Message."));
101+
assert(res.isError("func",": My Message."));
97102
}
98103

99104
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
100105

101106
package struct Command
102107
{
103-
alias Parse = Result delegate(const Command[] cmdStack, string argName, string[] argValue);
108+
alias Parse = Result delegate(const Command[] cmdStack,ref RawParam param);
104109

105110
struct Argument
106111
{
@@ -351,14 +356,12 @@ package(argparse) Command createCommand(Config config, COMMAND_TYPE)(ref COMMAND
351356
res.restrictions.add!(COMMAND_TYPE, [typeTraits.argumentInfos])(config);
352357

353358
enum getArgumentParsingFunction(alias uda) =
354-
(const Command[] cmdStack, string argName, string[] argValue)
355-
=> ArgumentParsingFunction!(config, uda)(cmdStack, receiver, argName, argValue);
359+
(const Command[] cmdStack, ref RawParam param) => ArgumentParsingFunction!uda(cmdStack, receiver, param);
356360

357361
res.parseFuncs = [staticMap!(getArgumentParsingFunction, typeTraits.argumentUDAs)];
358362

359363
enum getArgumentCompleteFunction(alias uda) =
360-
(const Command[] cmdStack, string argName, string[] argValue)
361-
=> ArgumentCompleteFunction!(config, uda)(cmdStack, receiver, argName, argValue);
364+
(const Command[] cmdStack, ref RawParam param) => ArgumentCompleteFunction!uda(cmdStack, receiver, param);
362365

363366
res.completeFuncs = [staticMap!(getArgumentCompleteFunction, typeTraits.argumentUDAs)];
364367

source/argparse/internal/help.d

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module argparse.internal.help;
22

33
import argparse.ansi;
44
import argparse.config;
5+
import argparse.param;
56
import argparse.result;
67
import argparse.api.ansi: ansiStylingArgument;
78
import argparse.internal.lazystring;
@@ -154,7 +155,7 @@ package struct HelpArgumentUDA
154155
return info;
155156
}();
156157

157-
Result parse(COMMAND_STACK, RECEIVER)(const Config config, const COMMAND_STACK cmdStack, ref RECEIVER, string argName, string[] rawValues)
158+
Result parse(COMMAND_STACK, RECEIVER)(const COMMAND_STACK cmdStack, ref RECEIVER receiver, RawParam param)
158159
{
159160
import std.stdio: stdout;
160161
import std.algorithm: map;
@@ -165,7 +166,7 @@ package struct HelpArgumentUDA
165166
auto args = cmdStack.map!((ref _) => &_.arguments).array;
166167

167168
auto output = stdout.lockingTextWriter();
168-
printHelp(_ => output.put(_), config, cmdStack[$-1], args, progName);
169+
printHelp(_ => output.put(_), *param.config, cmdStack[$-1], args, progName);
169170

170171
return Result.Error(0, ""); // hack to force-exit (to be removed)
171172
}

0 commit comments

Comments
 (0)