Skip to content

Commit

Permalink
Refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
andrey-zherikov committed Feb 2, 2025
1 parent 77e1c11 commit 8b88b3f
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 20 deletions.
2 changes: 1 addition & 1 deletion source/argparse/api/argument.d
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,7 @@ auto PreValidation(T, RETURN, VALUE)(ArgumentUDA!T uda, RETURN function(VALUE va
if((is(VALUE == string) || is(VALUE == string[]) || is(VALUE == RawParam)) &&
(is(RETURN == bool) || is(RETURN == Result)))
{
auto desc = createArgumentUDA(uda.info, uda.valueParser.changePreValidation(ValidationFunc!(string[])(func)));
auto desc = createArgumentUDA(uda.info, uda.valueParser.changePreValidation(ValidationFunc!string(func)));

return desc;
}
Expand Down
32 changes: 23 additions & 9 deletions source/argparse/internal/errorhelpers.d
Original file line number Diff line number Diff line change
Expand Up @@ -5,42 +5,56 @@ import argparse.param;
import argparse.result;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package Result processingError(T)(Param!T param, string prefix = "Can't process value")
private auto createErrorMessage(T)(Param!T param, string prefix)
{
import std.conv: to;
import std.array: appender;
import std.conv: to;

immutable namedArg = param.name.length > 0 && param.name[0] == param.config.namedArgPrefix;

auto a = appender!string(prefix);

static if(__traits(hasMember, param, "value"))
{
a ~= " '";
a ~= param.config.styling.positionalArgumentValue(param.value.to!string);
if(namedArg)
a ~= param.config.styling.namedArgumentValue(param.value.to!string);
else
a ~= param.config.styling.positionalArgumentValue(param.value.to!string);
a ~= "'";
}

if(param.name.length > 0 && param.name[0] == param.config.namedArgPrefix)
if(namedArg)
{
a ~= " for argument '";
a ~= param.config.styling.argumentName(param.name);
a ~= "'";
}

return Result.Error(a[]);
return a;
}

package Result processingError(T)(Param!T param)
{
return Result.Error(createErrorMessage(param, "Can't process value")[]);
}

package Result invalidValueError(T)(Param!T param)
package Result invalidValueError(T)(Param!T param, string suffix = "")
{
return processingError(param, "Invalid value");
auto msg = createErrorMessage(param, "Invalid value");
msg ~= suffix;

return Result.Error(msg[]);
}


unittest
{
Config config;
assert(processingError(Param!void(&config, "")).isError("Can't process value"));
assert(processingError(Param!void(&config, "--abc")).isError("Can't process value for argument","--abc"));
assert(processingError(Param!void(&config, "")).isError("Can't process value"));
assert(processingError(Param!(int[])(&config, "", [1,2])).isError("Can't process value '","[1, 2]"));
assert(processingError(Param!(int[])(&config, "--abc", [1,2])).isError("Can't process value '","[1, 2]","' for argument '","--abc"));
assert(invalidValueError(Param!(int[])(&config, "--abc", [1,2])).isError("Invalid value '","[1, 2]","' for argument '","--abc"));
assert(invalidValueError(Param!(int[])(&config, "--abc", [1,2]), "custom suffix").isError("Invalid value '","[1, 2]","' for argument '","--abc", "custom suffix"));
}
19 changes: 19 additions & 0 deletions source/argparse/internal/validationfunc.d
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,14 @@ private struct Handler(TYPE)
{
return func(param);
}
static Result opCall(bool function(Param!(TYPE[]) param) func, Param!TYPE param)
{
return func(Param!(TYPE[])(param.config, param.name, [param.value])) ? Result.Success : invalidValueError(param);
}
static Result opCall(Result function(Param!(TYPE[]) param) func, Param!TYPE param)
{
return func(Param!(TYPE[])(param.config, param.name, [param.value]));
}

static if(isArray!TYPE)
{
Expand Down Expand Up @@ -86,6 +94,17 @@ package(argparse) struct ValidationFunc(TYPE)
{
return F.match!(_ => Handler!TYPE(_, param));
}

Result opCall(Param!(TYPE[]) param) const
{
foreach(ref value; param.value)
{
auto res = opCall(Param!TYPE(param.config, param.name, value));
if(!res)
return res;
}
return Result.Success;
}
}

unittest
Expand Down
20 changes: 10 additions & 10 deletions source/argparse/internal/valueparser.d
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ package(argparse) struct ValueParser(PARSE_TYPE, RECEIVER_TYPE)
{
//////////////////////////
/// pre process
void function(ref RawParam param) preProcess;
private void function(ref RawParam param) preProcess;

auto changePreProcess(void function(ref RawParam param) func)
{
Expand All @@ -29,9 +29,9 @@ package(argparse) struct ValueParser(PARSE_TYPE, RECEIVER_TYPE)

//////////////////////////
/// pre validation
ValidationFunc!(string[]) preValidate;
private ValidationFunc!string preValidate;

auto changePreValidation(ValidationFunc!(string[]) func)
auto changePreValidation(ValidationFunc!string func)
{
preValidate = func;
return this;
Expand All @@ -40,7 +40,7 @@ package(argparse) struct ValueParser(PARSE_TYPE, RECEIVER_TYPE)
//////////////////////////
/// parse
static if(!is(PARSE_TYPE == void))
ParseFunc!PARSE_TYPE parse;
private ParseFunc!PARSE_TYPE parse;

auto changeParse(P)(ParseFunc!P func) const
if(is(PARSE_TYPE == void) || is(PARSE_TYPE == P))
Expand All @@ -51,7 +51,7 @@ package(argparse) struct ValueParser(PARSE_TYPE, RECEIVER_TYPE)
//////////////////////////
/// validation
static if(!is(PARSE_TYPE == void))
ValidationFunc!PARSE_TYPE validate;
private ValidationFunc!PARSE_TYPE validate;

auto changeValidation(P)(ValidationFunc!P func) const
if(is(PARSE_TYPE == void) || is(PARSE_TYPE == P))
Expand All @@ -62,7 +62,7 @@ package(argparse) struct ValueParser(PARSE_TYPE, RECEIVER_TYPE)
//////////////////////////
/// action
static if(!is(PARSE_TYPE == void) && !is(RECEIVER_TYPE == void))
ActionFunc!(RECEIVER_TYPE, PARSE_TYPE) action;
private ActionFunc!(RECEIVER_TYPE, PARSE_TYPE) action;

auto changeAction(P, R)(ActionFunc!(R, P) func) const
if((is(PARSE_TYPE == void) || is(PARSE_TYPE == P)) &&
Expand All @@ -74,7 +74,7 @@ package(argparse) struct ValueParser(PARSE_TYPE, RECEIVER_TYPE)
//////////////////////////
/// noValueAction
static if(!is(RECEIVER_TYPE == void))
NoValueActionFunc!RECEIVER_TYPE noValueAction;
private NoValueActionFunc!RECEIVER_TYPE noValueAction;

auto changeNoValueAction(R)(NoValueActionFunc!R func) const
if(is(RECEIVER_TYPE == void) || is(RECEIVER_TYPE == R))
Expand Down Expand Up @@ -144,7 +144,7 @@ package(argparse) struct ValueParser(PARSE_TYPE, RECEIVER_TYPE)
ValueParser!(PARSE_TYPE, RECEIVER_TYPE) res;

res.preProcess = (ref _) {};
res.preValidate = (string[] _) => true;
res.preValidate = (string _) => true;
res.validate = (PARSE_TYPE _) => true;

static if(is(RECEIVER_TYPE == PARSE_TYPE))
Expand Down Expand Up @@ -221,7 +221,7 @@ if(!is(T == void))
static if(is(T == enum))
{
enum TypedValueParser = ValueParser!(T, T).defaults
.changePreValidation(ValidationFunc!(string[])((RawParam _) => ValueInList(getEnumValues!T)(_)))
.changePreValidation(ValidationFunc!string((RawParam _) => ValueInList(getEnumValues!T)(_)))
.changeParse(ParseFunc!T((string _) => getEnumValue!T(_)));
}
else static if(isSomeString!T || isNumeric!T)
Expand All @@ -243,7 +243,7 @@ if(!is(T == void))
foreach(ref value; param.value)
value = value.length == 0 ? "y" : value.representation.map!(_ => immutable char(_.toLower)).array;
})
.changePreValidation(ValidationFunc!(string[])((RawParam _) => ValueInList("true","yes","y","false","no","n")(_)))
.changePreValidation(ValidationFunc!string((RawParam _) => ValueInList("true","yes","y","false","no","n")(_)))
.changeParse(ParseFunc!T((string value)
{
switch(value)
Expand Down
5 changes: 5 additions & 0 deletions source/argparse/param.d
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@ struct Param(VALUE_TYPE)

static if(!is(VALUE_TYPE == void))
VALUE_TYPE value;

package bool isNamedArg() const
{
return name.length > 0 && name[0] == config.namedArgPrefix;
}
}

alias RawParam = Param!(string[]);
Expand Down

0 comments on commit 8b88b3f

Please sign in to comment.