Thread overview
Getopt default int init and zero
May 19, 2017
Suliman
May 19, 2017
Jonathan M Davis
May 20, 2017
Jon Degenhardt
May 19, 2017
I would like to check if user specified `0` as getopt parameter. But the problem that `int`'s are default in `0`. So if user did not specified nothing `int x` will be zero, and all other code will work as if it's zero.

In std.typecons I found Nullable that allow init int to zero. I tried to do:

Nullable!int dateInterval;

try
{
	auto helpInformation = getopt(args,
	"interval|i",  "Interval of selection in dayes", &dateInterval
	);
}

But I am getting error:

conv.d(194,24): Error: template std.conv.toImpl cannot deduce function from argument types !(Nullable!int)(string), candidates are:
conv.d(435,11):        std.conv.toImpl(T, S)(S value) if (isImplicitlyConvertible!(S, T) && !isEnumStrToStr!(S, T) && !isNullToStr!(S, T))
conv.d(549,11):        std.conv.toImpl(T, S)(ref S s) if (isStaticArray!S)
conv.d(565,11):        std.conv.toImpl(T, S)(S value) if (!isImplicitlyConvertible!(S, T) && is(typeof(S.init.opCast!T()) : T) && !isExactSomeString!T && !is(typeof(T(value))))
conv.d(616,11):        std.conv.toImpl(T, S)(S value) if (!isImplicitlyConvertible!(S, T) && is(T == struct) && is(typeof(T(value))))
conv.d(665,11):        std.conv.toImpl(T, S)(S value) if (!isImplicitlyConvertible!(S, T) && is(T == class) && is(typeof(new T(value))))
conv.d(194,24):        ... (9 more, -v to show) ...
getopt.d(894,56): Error: template instance std.conv.to!(Nullable!int).to!string error instantiating
getopt.d(749,46):        instantiated from here: handleOption!(Nullable!int*)
getopt.d(758,23):        instantiated from here: getoptImpl!(string, string, Nullable!int*, string, string, bool*)
getopt.d(436,15):        instantiated from here: getoptImpl!(string, string, int[]*, string, string, Nullable!int*, string, string, bool*)
source\app.d(41,32):        instantiated from here: getopt!(string, string, int[]*, string, string, Nullable!int*, string, string, bool*)
May 19, 2017
On Friday, May 19, 2017 12:09:38 PM PDT Suliman via Digitalmars-d-learn wrote:
> I would like to check if user specified `0` as getopt parameter. But the problem that `int`'s are default in `0`. So if user did not specified nothing `int x` will be zero, and all other code will work as if it's zero.
>
> In std.typecons I found Nullable that allow init int to zero. I tried to do:
>
> Nullable!int dateInterval;
>
> try
> {
>   auto helpInformation = getopt(args,
>   "interval|i",  "Interval of selection in dayes", &dateInterval
>   );
> }
>
> But I am getting error:

getopt really only supports built-in types. I'd suggest that you try setting the int to a value other than zero that you don't expect the user to enter (e.g. -1 or int.max) and check for that. Alternatively, you could use string, and then convert it using std.conv.to, which certainly isn't as nice, because getopt isn't doing the conversion for you, but whereas you can't check for an empty int, you _can_ check for an empty string.

Adding support for Nullable to getopt sounds like a good enhancement request though. This is a very valid use case that is not well-served at the moment, and supporting Nullable doesn't require figuring out how to support aribitrary user-defined types, which is a whole other can of worms.

https://issues.dlang.org

And of course, if you're brave enough to figure enough out about getopt's internal's to implement it yourself and create a pull request, that would be quite welcome. :)

- Jonathan M Davis

May 20, 2017
On Friday, 19 May 2017 at 12:09:38 UTC, Suliman wrote:
> I would like to check if user specified `0` as getopt parameter. But the problem that `int`'s are default in `0`. So if user did not specified nothing `int x` will be zero, and all other code will work as if it's zero.

One way to do this is the use a callback function or delegate. Have the callback set both the main variable and a boolean tracking whether the option was entered.

--Jon