On Wednesday, 13 October 2021 at 16:24:52 UTC, Steven
Schveighoffer wrote:
The point is that I shouldn't have to tell the library the name
of something that I've already given a name to.
Having them named differently on the command line than the
actual field name should still be a possibility (and required
in some cases, e.g. the `enum` case above), but honestly, the
`Params` struct exists solely to accept command line
parameters, there's no compelling need to use alternate names
for the command line and the field name. If the library
automatically does the right thing by default, then your code
becomes simpler and more beautiful.
Not to detract from your library, because I think it's an
awesome design to model using structs (one I use all the time),
but the API developer in me frowns at lack of DRY. Try to focus
on requiring the smallest amount of machinery/attributes
possible. Every time you require extraneous pieces to get
things to work, it adds another place where errors/confusion
can happen.
I got your point. Omitting the name is good suggestion and I'll
add this.
Regarding the detecting all members and treating them as an
arguments, I see one issues so far: the struct might have other
members that are not used in CLI (it can be even functions).
Consider the example when the member is renamed but the struct
still provides the old name for backward compatibility:
```d
struct T
{
string name;
@property string label() const { return name; }
}
pragma(msg, __traits(allMembers, T)); // tuple("name", "label")
```
Another example is when the struct has additional functions
convenient for the users so it's not clear whether `void foo()`
is a CLI flag or just a convenient function.
So to implement your suggestion correctly, `argparse` should
provide a way to opt-out specific members from CLI.
In addition to that, each CLI argument usually has its own help
text so in most cases each member will have an UDA with this text
which makes opt-out approach mush less useful. So it sill look
like this at the end:
```d
struct T
{
@help("First name")
string firstName;
@help("Last name")
string lastName;
@skip
@property string fullName() const { return firstName~"
"~lastName; }
}
```