[GRASS-dev] Possible to use "conditionals" for scri pt options, flags?

Glynn Clements glynn at gclements.plus.com
Fri Nov 21 10:42:32 PST 2014


Nikos Alexandris wrote:

> What is the common practice for this? Define both options as optional 
> and do the necessary checks inside the script?  Or, is there a way to 
> override options if another option is given in the definition-header?

Marking an option as "required" will result in the parser raising a
fatal error if the option is not given, with one exception: if a flag
has the suppress_required option, and that flag is given, all
requirements are ignored. This feature is intended for flags which
abandon "normal operation" for the module; e.g. r.in.gdal's -f flag
(list supported formats) uses it.

But in general, you cannot mark an option as required if it is
optional except for the special case of a suppress_required flag.

Historically, the solution was to make the option not requrired, then
explicitly check the combinations in the code, e.g. (for C)

	if (!(altitude->answer || elevation->answer))
	    G_fatal_error(_("either %s= or %s= must be given"),
	        altitude->key, elevation->key);

However, GRASS 7 now has the ability to specify option relationships
to the parser. For C, the relevant functions are those in
lib/gis/parser_dependencies.c.

For scripts, relationships are specified using a "rules" section, e.g.

	#%rules
	#%required altitude,elevation
	#%end

specifies that at least one of those options must be given. Both
options and flags can be specified (a leading "-" denotes a flag).

The available rule types are:

    exclusive	- at most one of the options may be given

    required	- at least one of the options must be given

    requires	- if the first option is given, at least one of the
		subsequent options must also be given

    requires_all - if the first option is given, all of the
		subsequent options must also be given

    excludes	- if the first option is given, none of the
		subsequent options may be given

    collective	- all or nothing; if any option is given, all must
		be given

Note that the "required" rule was overlooked from g.parser; I've just
committed a fix now in r62850.

-- 
Glynn Clements <glynn at gclements.plus.com>


More information about the grass-dev mailing list