dst/source/arg.d

50 lines
1.4 KiB
D
Raw Normal View History

2025-06-26 18:47:07 +00:00
module arg;
import core.stdc.stdlib : abort;
__gshared string argv0;
void parseArgs(ref string[] args, void delegate(char, string delegate(), string delegate(lazy void)) handleArg) {
argv0 = args[0];
args = args[1..$];
while (args.length > 0 && args[0].length > 0 && args[0][0] == '-' && args[0].length > 1) {
if (args[0] == "--") {
args = args[1..$];
break;
}
auto currentArg = args[0];
args = args[1..$];
for (size_t i = 1; i < currentArg.length; i++) {
char argc_ = currentArg[i];
string getArgValue() {
if (i + 1 < currentArg.length) {
return currentArg[i+1..$];
} else if (args.length > 0) {
auto val = args[0];
args = args[1..$];
return val;
}
return null;
}
string requireArgValue(lazy void onError) {
auto val = getArgValue();
if (val is null) {
onError();
abort();
}
return val;
}
handleArg(argc_, &getArgValue, &requireArgValue);
if (i + 1 < currentArg.length && getArgValue() !is null) {
break;
}
}
}
}