[m-rev.] for review / comment: structured errors for getopt

Julien Fischer jfischer at opturion.com
Wed Apr 2 11:49:07 AEDT 2014


Hi Paul,

On Wed, 2 Apr 2014, Paul Bone wrote:

> On Tue, Mar 25, 2014 at 05:21:34PM +1100, Julien Fischer wrote:
>>
>> For review / feedback.
>>
>> I'm not intending to push this to github in its current form; in requesting a review
>> I am mainly seeking feedback on the following things:
>>
>> (1) the overall proposal.
>
> It's good, I'm in favor of using the type system rather than storing
> information like this in strings.
>
> Do you have plans for deprecating the original API and renaming the _se
> predicates to the normal ones?

In the *very* long term that is the plan, but that particular API has
been around for a very long time and a lot of software uses it.

>> (2) in particular, the names of the constructors of the option_error/1 type and
>>     their documentation.
>
> See below.
>
>>
>> diff --git a/library/getopt_io.m b/library/getopt_io.m
>> index 84ea522..69cac88 100644
>> --- a/library/getopt_io.m
>> +++ b/library/getopt_io.m
>> +
>> +:- type option_error(OptionType)
>> +    --->    unrecognized(string)
>> +            % An option that is not recognized appeared on the command line.
>> +            % The argument gives the option as it appeared on the command line.
>> +
>> +    % The first two arguments of the remaining constructors of this type
>> +    % identify the option enumeration value and the string that appeared on the
>> +    % command line for that option respectively.
>> +
>> +    ;       unknown_type(OptionType, string)
>> +            % No type has been specified for the option.
>> +
>
> I don't understand this.  My guess is that a type is whether an option's
> value is an int, string, bool etc, but this isn't absolutly clear.  I'm more
> confused by "specified", what is an example of how a type, at runtime, could
> fail to be specified?  Maybe a quick example should be in the comment here.

It means that no type has been specified for the option in the
"option_default" predicate that you need to provide to getopt -- I'll
try rewording it.

>> +    ;       requires_argument(OptionType, string)
>> +            % The option requires an argument but it occurred on the command
>> +            % line without one.
>> +
>> +    ;       does_not_allow_argument(OptionType, string, string)
>> +            % The option does not allow an argument but it was provided with
>> +            % one on the command line.
>> +            % The third argument gives the contents of the argument position
>> +            % on the command line.
>> +
>> +    ;       cannot_negate(OptionType, string)
>> +            % The option cannot be negated but its negated form appeared on
>> +            % the command line.
>> +
>> +    ;       special_handler_failed(OptionType, string)
>> +            % The special option handler predicate for the option failed.
>> +
>> +    ;       special_handler_missing(OptionType, string)
>> +            % A special option handler predicate was not provided for the option.
>> +
>> +    ;       special_handler_error(OptionType, string, string)
>> +            % The special option handler predicate for the option returned an
>> +            % error.
>> +            % The third argument is a string describing the error.
>> +
>> +    ;       requires_numeric_argument(OptionType, string, string)
>> +            % The option requires a numeric argument but it occurred on the
>> +            % command line with a non-numeric argument.
>> +            % The third argument gives the argument as it appeared on
>> the +            % command line.
>> +
>> +    ;       file_special_cannot_open(OptionType, string, string, io.error)
>> +            % The option is a file_special option whose argument is the file
>> +            % named by the third argument.
>> +            % Attempting to open this file resulted in the I/O error given
>> +            % by the fourth argument.
>> +
>> +    ;       file_special_cannot_read(OptionType, string, string, io.error)
>> +            % The option is a file_special option whose argument is the file
>> +            % named by the third argument.
>> +            % Attempting to read from this file resulted in the I/O error given
>> +            % by the fourth argument.
>> +
>> +    ;       file_special_contains_non_option_args(OptionType, string, string).
>> +            % The option is a file_special option whose argument is the file
>> +            % named by the third argument.  This file contained some non-option
>> +            % arguments.
>
> This isn't a strong opinion, but it may be reasonable to fold these three
> constructors together, and then either in the 3rd argument or in a new
> argument specify at what stage reading the file failed.

I thought about that, but have look at the revised diff I posted the
other day addressing Peter Wang's comments.

Cheers,
Julien.



More information about the reviews mailing list