Re: Getopt default int init and zero

2017-05-20 Thread Jon Degenhardt via Digitalmars-d-learn

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


Re: Getopt default int init and zero

2017-05-19 Thread Jonathan M Davis via Digitalmars-d-learn
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", 
>   );
> }
>
> 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



Getopt default int init and zero

2017-05-19 Thread Suliman via Digitalmars-d-learn
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", 
);
}

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*)