4.5. Controlling the Prompt

4.5.1. Introduction

Reliable prompting of the user for input values is a critical part of any application interface. EMBOSS allows you precise control over how application parameters are prompted for and thereby saves you a great deal of development time. This is achieved by using ACD data attributes:

  • parameter: "Y" means that the data item is a parameter, i.e. you do not have to use the data label to specify a value for it on the command line. e.g. myprog 10.

  • standard: "Y" and additional: "Y" mean that the data item is a qualifier, i.e. you do have to use the data label to specify a value for it on the command line. e.g. myprog -somevalue 10. If a data definition is not defined to be a parameter, or a standard or additional qualifier then it will default to an advanced qualifier.

  • Values for parameters and standard qualifiers are always prompted for (with their default value) if not specified on the command line.

  • Values for additional qualifiers are not prompted for (a default value will be used) unless -options is given on the command line. A default value for additional qualifiers should always be given in the ACD file.

  • Values for advanced qualifiers are never prompted for.

4.5.2. Parameters

Consider the following ACD file, for an application called helloworld, which defines two parameters, namely a string input (string datatype) and an output file (outfile datatype):

application: helloworld 
[
    documentation: "Prints something arguably uninteresting"
]

string: message 
[
    parameter: "Y"
]

outfile: outfile 
[
    parameter: "Y"
]

Values for parameters must be specified on the command line in the order they appear in the ACD file. So to specify both parameters for helloworld you'd have to type something like:

helloworld "Hello World!" message.dat

That would cause Hello World! to be printed to the output file message.dat. Alternatively it's also perfectly acceptable to use one of:

helloworld -message "Hello World!" -outfile message.dat
helloworld -outfile message.dat -message "Hello World!"
helloworld -message "Hello World!" message.dat

For parameters you don't have to use the name flag whereas for qualifiers (see below) you do. If you omit the flag for parameters then their values must appear on the command line in the order in which they appear in the ACD file.

However, you might not want to force the user to specify a message, instead relying on a default message ("Hello World!") defined in the ACD file to be printed if nothing else is given. So by typing:

helloworld message.dat

you want "Hello World!" (the default message) to be printed to the file message.dat.

The above ACD file will not do that. All the data definitions are parameters (parameter:) and therefore will be prompted for if they are not given on the command line. Typing the command above would result in message.dat being taken as the string to be printed, and you'd then be prompted for an output file name. In short, not the desired behaviour. This is where qualifiers come in.

4.5.3. Qualifiers

Values for qualifiers (whether "standard", "additional" or "advanced") can appear anywhere on the command line but you must always refer to them by their flag. So if your message is defined as a qualifier, rather than a parameter, the reference to it has to look like this:

-message "Hello World!"

To specify a data definition as a qualifier, you use standard: or additional: rather than the parameter: attribute that's currently specified. Alternatively, if you don't specify any of these attributes it will default to being an advanced qualifier. For example:

application: helloworld 
[
    documentation: "Prints something arguably uninteresting"
]

string: message 
[
    standard: "Y"
]

outfile: outfile 
[
    parameter: "Y"
]

As you now have only one parameter, both of the following command lines are valid:

helloworld -message "Hello World!" message.dat
helloworld message.dat -message "Hello World!"

Now if you don't specify the message text on the command line, i.e. you just type:

helloworld message.dat

then message.dat will be treated as a parameter, and taken to be the output file name. The program will then prompt you for a string to print out. This is close to what we wanted, but still not quite the desired behaviour. What we wanted was for it to go ahead and run with a default string.

4.5.4. Defaults

You can associate a default value for most data definitions using the default: attribute. The ACD can be modified as follows:

application: helloworld 
[
    documentation: "Prints something arguably uninteresting"
]

string: message 
[
    standard: "Y"
    default: "Hello World!"
]

outfile: outfile 
[
    parameter: "Y"
]

Now if you typed:

helloworld message.dat

then although you specified a default it's still prompting for a value. Remember that all values for standard data definitions are always prompted for, regardless of whether a default is specified or not. You need to specify message as being an "additional" or "advanced" qualifier, which are not normally prompted for.

The ACD file will look like this:

application: helloworld 
[
    documentation: "Prints something arguably uninteresting"
]

string: message 
[
    additional: "Y"
    default: "Hello World!"
]

outfile: outfile 
[
    parameter: "Y"
]

This ACD finally does what is needed. Typing:

helloworld message.dat

will print Hello World! to the file message.dat i.e. the desired behaviour.

You can of course override the default message by specifying the message on the command line:

helloworld -message "Goodbye World!" message.dat

This will print a rather morbid message to the output file. You should usually supply a default value for additional and advanced ACD data definitions as EMBOSS will not prompt you for a value if you don't specify one on the command line. EMBOSS would generate an error if you tried, from within your C source code, to access the value of an unspecified data item. In contrast, values for standard and parameter data definitions are always prompted for if they're not specified on the command line, therefore a default is useful but not essential.

Note

Note that some datatypes such as boolean have an inbuilt default value.

4.5.5. Maxima and Minima

It is often either useful or vital to be able to set limits on the maximum and/or minimum values to be associated with an ACD datatype definition. This is done in an intuitive way using the minimum and maximum attributes:

integer: window 
[
    standard: "Y"
    default:  "10"
    minimum:  "5"
    maximum:  "100"
]

4.5.6. Setting the Prompts

EMBOSS will always provide default prompt text. Consider the following ACD file:

integer: window
[
    standard: "Y"
    default: "10"
    minimum: "5"
    maximum: "100"
]

The user would be prompted as follows:

  -window : Enter a number [10]:

Though adequate this is not entirely friendly. You can set the prompt for a datatype definition by using the information:attribute. The ACD file would then look like this:

integer: window
[
    standard: "Y"
    default: "10"
    minimum: "5"
    maximum: "100"
    information: "Window size"
]

This will give the following as the prompt.

  Window size [10]:

which is much more meaningful.

4.5.7. Negation

So far you have only described the value of "Y" after a parameter or qualifier definition. However, negation (specifying, indirectly, a value of "N") often finds a use in ACD files. Take a simple example:

sequence: sequence 
[
    parameter: "Y"
]

integer: n
[
    standard: "@($(sequence.length) > 100)"
]

The standard: attribute i.e. being set to "Y" if the sequence length is greater than 100 or N otherwise. Although a value of "N" should never be specified explicitly after parameter:, standard:, or additional:, calculated values that evaluate to "N" are in fact supported for the qualifiers (but not parameters). In such cases, the "N" overrides the default behaviour of the attributes such that prompting for a value will be turned off. This is useful in some situations. In this case, the calculation will switch a prompt on only if the sequence length is greater than 100.

Now let us assume that your application can produce both graphic and textual output. Assume further that you only want textual output if the user hasn't selected graphical output. First you would set up a toggle ACD datatype definition as follows:

toggle: plot 
[
    standard: "Y"
    default: "N"
    information: "Plot a graph"
]

The value of $(plot) will be "Y" if the user adds -plot to the command line. The value is N if either the user doesn't add anything to the command line or if the user adds -noplot to the command line.

The output file can now be defined as:

outfile: outfile 
[
    standard: "@(!$(plot))"
]

This becomes equivalent to standard: "Y" only if plot is not true. The negation operator (!) is a calculation so the term must be surrounded by @().

The only sad thing about this is that it doesn't work as written but not for any reason involving the logic. The reason is because EMBOSS handles file input/output operations in a different manner to other datatypes. If it sees one of the file (e.g. outfile) or sequence (e.g. seqout) definitions it will always try and open it.

If the term equates to standard: "N", and no filename has been specified on the command line or as a default (and you wouldn't normally specify a default name for an output file) then ACD parsing will try and open a file with no name. That would cause an error.

There is a way around this and that is to use the nullok: attribute. So, a definition of outfile that works is:

outfile: outfile 
[
    standard: "@(!$(plot))"
    nullok: "Y"
]

The nullok: attribute above means that it's OK to continue (do not generate an error) if no filename is given.

Note

If you run an ACD file (for instance, testing it by using acdc (Section 4.6.4.1, “acdc) with calculated values for standard:, you will see a warning message of the type Calculated standard value for qualifier QualifierName in section SectionName. The use of calculations in this way is supported but is only recommended if absolutely necessary. This is because it can confuse the comprehension of application inputs by, for instance, third party interfaces.

Caution

Calculations should not be used to set the value of a parameter:: an error will be generated during ACD processing if you do. Parameters are taken to be essential inputs to the application. In contrast, calculations can be used to control the prompting for qualifiers (whether standard, additional or advanced).

4.5.8. Boolean Datatypes

The ACD syntax provides two datatypes (Boolean and Toggle) that have boolean values. Boolean is a standard boolean datatype whereas a toggle is a special type of boolean datatype that is used exclusively to control the prompting of other attributes.

In the ACD file below, an application with two parameters and an advanced qualifier (abool) of Boolean datatype is shown. abool might conceivably be used to set verbose or terse text in the output file, though it would be given a more intuitive name.

application: seqdemo 
[
    documentation: "Demo application"
]

sequence: asequence 
[
    parameter: "Y"
]

boolean: abool
[
    default: "Y"
]

outfile: outfile 
[
    parameter: "Y"
]

The application could be invoked in either of the following ways:

seqdemo filename.seq filename.out -abool
seqdemo filename.seq filename.out -noabool

In the first example the boolean qualifier abool is set to True and verbose output (or some other behaviour) would be set. In fact, the value needn't have been set explicitly since the default value is True. In the second command line abool is set to False using the prefix no.

4.5.8.1. Prompting for boolean Values

Care should be taken over the definition of the information: and help: global attributes for boolean datatypes. These are used to prompt the user (interactively or via a GUI) and to provide help text. The text provided in each case should reflect the expected default value of the boolean option, which may be the opposite of what the name implies. For example, if set to "Y" by default, then the command line option would typically be "-noFlag" where Flag is the qualifier. If set to "N" by default, then the default action may be the opposite of what the information or help text implies. If the value is calculated then the user may need some extra guidance.