DEV Community

Dimitri Gilbert
Dimitri Gilbert

Posted on • Updated on • Originally published at dbuild.io

ParseArger deeper: --pos --opt and --flag

Now that you know the basic of parseArger generate and parse, it's time to have a look at how we declare arguments, options and flags !

--pos

Positional arguments are what most of us use in a bash script with $1, $2, $...
Well same thing here, but they have names And much more :

arg-name: positional argument name
description: positional argument description
--one-of <one-of>: accepted values, repeatable
--complete <complete>: bash built-in completely function, repeatable
--complete-custom <complete-custom>: completely custom dynamic suggestion, repeatable
--subcommand-directory <subcommand-directory>: directory containing subcommands, force subcommand, list parseArger script in directory to fill --one-of
--subcommand-variable <subcommand-variable>: array variable containing subcommand parts, force subcommand [default: ' __subcommand ']
--subcommand|--no-subcommand: is a subcommand
--subcommand-run|--no-subcommand-run: run subcommand, forces sub command
--subcommand-use-leftovers|--no-subcommand-use-leftovers: add leftover arguments to subcommand, forces subcommand
Enter fullscreen mode Exit fullscreen mode

And a dumb example that generates a script that take one argument my-cmd and execute it as a subcommand using the leftover arguments, my-cmd must be one of "ls", "cd" or "cat" :

parseArger generate --pos \
  'my-cmd "an argument" --subcommand --subcommand-run --subcommand-use-leftovers --one-of ls --one-of cd --one-of cat'
Enter fullscreen mode Exit fullscreen mode

arg-name

The argument name, - will be replaced with _ and the variable will be prefixed with _arg_.
So --my-super-argument value is assigned to $_arg_my_super_argument.

description

Simple description for help, documentation and so on

--one-of

Repeatable, The argument value must be one of, the most basic input validation, yeah !

parseArger generate --pos 'my-arg "my argument description" --one-of value1 --one-of value2'
Enter fullscreen mode Exit fullscreen mode

--complete

Repeatable, Completely built-ins.

parseArger generate --pos 'my-file "this is a file path" --complete file'
Enter fullscreen mode Exit fullscreen mode

--complete-custom

Repeatable, Completely custom

parseArger generate --pos 'my-arg "this is an argument" --complete-custom "\$(echo \"some_value some_other you_get the_point\")"'
Enter fullscreen mode Exit fullscreen mode

--subcommand-directory

You been a good kid and you did split your scripts ?
If they're all in the subcommand-directory, parseArger will add them to one of and build a __subcommand variable for you to use.
It forces --subcommand ... in case you were wondering.

parseArger generate --pos 'my-arg "this is an argument" --subcommand-directory bin'
Enter fullscreen mode Exit fullscreen mode

--subcommand-variable

Ooooh, oh you don't like __subcommand !!? What should it be called then ? It forces --subcommand.

parseArger generate --pos 'my-arg "this is an argument" --subcommand-variable notAsubCommand'
Enter fullscreen mode Exit fullscreen mode

--subcommand

This is a subcommand

parseArger generate --pos 'my-arg "this is a command argument" --subcommand'
Enter fullscreen mode Exit fullscreen mode

--subcommand-run

Run the subcommand before handing you the script, forces --subcommand.

parseArger generate --pos 'my-arg "this is an argument" --subcommand-run'
Enter fullscreen mode Exit fullscreen mode

--subcommand-use-leftovers

Maybe those leftovers are worth something..., after all ! Forces --subcommand

parseArger generate --pos 'my-arg "this is an argument" --subcommand-use-leftovers
Enter fullscreen mode Exit fullscreen mode

--opt

I'm pretty sure most of you were waiting for that : (add ethereal music here) options !

arg-name: positional argument name
description: positional argument description
--repeat-min <repeat-min>: minimum repeatition forces repeat [default: ' 1 ']
--repeat-max <repeat-max>: maximum repeatition forces repeat
--one-of <one-of>: accepted values, repeatable
-d, --default-value <default-value>: value, repeatable
-s, --short <short>: short form
--alias <alias>: option alias, repeatable
--empty-value <empty-value>: value for empty option
--complete <complete>: bash built-in completely function, repeatable
--complete-custom <complete-custom>: completely custom dynamic suggestion, repeatable
-r|--repeat|--no-repeat: repeatable
--empty|--no-empty: use option as flag
Enter fullscreen mode Exit fullscreen mode

I won't bore you with arg-name and description, and if you need me too, you might want to re read the previous part a tiny tad more attentively, maybe, if you'd like to.

--repeat-min

Repeatable option, yes ! but at least this many ! Forces --repeat.

parseArger generate --opt 'my-opt "this is an option" --repeat-min 42
Enter fullscreen mode Exit fullscreen mode

--repeat-max

Repeatable option, yes ! but not too much ! Forces --repeat.

parseArger generate --opt 'my-opt "this is an option" --repeat-max 69
Enter fullscreen mode Exit fullscreen mode

--one-of

see --pos --one-of above, it's the same ;)

--default-value

An option, why not, but it shall not be empty !

parseArger generate --opt 'my-opt "musnt be eeeemmmmpty" --default-value "this is not empty"'
Enter fullscreen mode Exit fullscreen mode

--short

I know ya'll concerned about bodily efficiency (my mom called that "lazy"...), letters matters ! you got 26 of'em, that's how many options max my scripts have !

parseArger generate --opt 'my-opt "lazily call me" --short o'
Enter fullscreen mode Exit fullscreen mode

--alias

I know it's hard to always agree (especially with yourself !), with aliases, no more decision (about option names), you can have your cake, and eat it, too !

parseArger generate --opt 'a-opt "lazily call me" --alias "an-opt" --alias "an-option" --alias "needlessly-long-option-name"'
Enter fullscreen mode Exit fullscreen mode

--short

I know ya'll concerned about bodily efficiency (my mom called that "lazy"...), letters matters ! you got 26 of'em, that's how many options max my scripts have !

parseArger generate --opt 'my-opt "lazily call me" --short o'
Enter fullscreen mode Exit fullscreen mode

--complete

see --pos --complete above, it's the same ;)

--complete-custom

see --pos --complete-custom above, it's the same ;)

--repeat

You can now have multiple values for your option. the option is now an array, even if only one value is given.

parseArger generate --opt 'my-opt "look ma', I'am an array !" --repeat'
Enter fullscreen mode Exit fullscreen mode

--empty

Option or flag ? Well, why not both ? A flag if you don't give it anything, an option otherwise !

parseArger generate --opt 'my-opt "option>flag superposition" --empty'
Enter fullscreen mode Exit fullscreen mode

--flag

Ahoy ! raise the flaaaaaag ! (I'd say I'm grasping at branches, but it seems tree do not grow in the ocean...)

arg-name: positional argument name
description: positional argument description
-s, --short <short>: short form
--no-name <no-name>: value for the negation
--alias <alias>: flag alias, repeatable
--no-alias <no-alias>: flag negation alias, repeatable
--on|--no-on: on by default
Enter fullscreen mode Exit fullscreen mode

You know the drill with arg-name, description, --short and alias, it's up above ;)

--no-name

--no-<flag-name> do not fly ? Fine, you choose !

parseArger generate --flag 'do-that "flabbergasted, flag a..." --no-name dont-do-that'
Enter fullscreen mode Exit fullscreen mode

--no-alias

There are plenty of ways to say no !

parseArger generate --flag 'do-that "flabbergasted, flag a..." --no-alias this-instead --no-alias do-this'
Enter fullscreen mode Exit fullscreen mode

--on

It's already on... but you can turn it off.

parseArger generate --flag 'do-that "flabbergasted, flag a..." --on'
Enter fullscreen mode Exit fullscreen mode

What now ?

Now you almost have the whole view on parseArger, enough for simple scripts anyway !
But maybe you do not value your mental health much and would like to create a whole program in bash ?
Well, What a coincidence, next time we'll have a look at the project command, it'll help you do just that ! (the program part, I do not deal in mental health)
As always bugs and suggestions should go on parseArger's github repo.

Thanks for the read and I hope you found it useful (or at least entertaining :D )

See you around and happy coding !

Top comments (0)