1*7423c01aSMichael Walsh#!/usr/bin/env python
2*7423c01aSMichael Walsh
3*7423c01aSMichael Walshr"""
4*7423c01aSMichael WalshThis module provides valuable argument processing functions like
5*7423c01aSMichael Walshgen_get_options and sprint_args.
6*7423c01aSMichael Walsh"""
7*7423c01aSMichael Walsh
8*7423c01aSMichael Walshimport sys
9*7423c01aSMichael Walsh
10*7423c01aSMichael Walshimport gen_print as gp
11*7423c01aSMichael Walsh
12*7423c01aSMichael Walsh
13*7423c01aSMichael Walsh
14*7423c01aSMichael Walsh###############################################################################
15*7423c01aSMichael Walshdef valid_value(var_value,
16*7423c01aSMichael Walsh                invalid_values=[""],
17*7423c01aSMichael Walsh                valid_values=[]):
18*7423c01aSMichael Walsh
19*7423c01aSMichael Walsh    r"""
20*7423c01aSMichael Walsh    Return True if var_value is a valid value.  Otherwise, return False and
21*7423c01aSMichael Walsh    print an error message to stderr.
22*7423c01aSMichael Walsh
23*7423c01aSMichael Walsh    Description of arguments:
24*7423c01aSMichael Walsh    var_value                       The value being validated.
25*7423c01aSMichael Walsh    invalid_values                  A list of invalid values.  If var_value is
26*7423c01aSMichael Walsh                                    equal to any of these, it is invalid.
27*7423c01aSMichael Walsh                                    Note that if you specify anything for
28*7423c01aSMichael Walsh                                    invalid_values (below), the valid_values
29*7423c01aSMichael Walsh                                    list is not even processed.
30*7423c01aSMichael Walsh    valid_values                    A list of invalid values.  var_value must
31*7423c01aSMichael Walsh                                    be equal to one of these values to be
32*7423c01aSMichael Walsh                                    considered valid.
33*7423c01aSMichael Walsh    """
34*7423c01aSMichael Walsh
35*7423c01aSMichael Walsh    len_valid_values = len(valid_values)
36*7423c01aSMichael Walsh    len_invalid_values = len(invalid_values)
37*7423c01aSMichael Walsh    if len_valid_values > 0 and len_invalid_values > 0:
38*7423c01aSMichael Walsh        gp.print_error_report("Programmer error - You must provide either an" +
39*7423c01aSMichael Walsh                              " invalid_values list or a valid_values" +
40*7423c01aSMichael Walsh                              " list but NOT both.")
41*7423c01aSMichael Walsh        return False
42*7423c01aSMichael Walsh
43*7423c01aSMichael Walsh    if len_valid_values > 0:
44*7423c01aSMichael Walsh        # Processing the valid_values list.
45*7423c01aSMichael Walsh        if var_value in valid_values:
46*7423c01aSMichael Walsh            return True
47*7423c01aSMichael Walsh        var_name = gp.get_arg_name(0, 1, 2)
48*7423c01aSMichael Walsh        gp.print_error_report("The following variable has an invalid" +
49*7423c01aSMichael Walsh                              " value:\n" +
50*7423c01aSMichael Walsh                              gp.sprint_varx(var_name, var_value) +
51*7423c01aSMichael Walsh                              "\nIt must be one of the following values:\n" +
52*7423c01aSMichael Walsh                              gp.sprint_varx("valid_values", valid_values))
53*7423c01aSMichael Walsh        return False
54*7423c01aSMichael Walsh
55*7423c01aSMichael Walsh    if len_invalid_values == 0:
56*7423c01aSMichael Walsh        gp.print_error_report("Programmer error - You must provide either an" +
57*7423c01aSMichael Walsh                              " invalid_values list or a valid_values" +
58*7423c01aSMichael Walsh                              " list.  Both are empty.")
59*7423c01aSMichael Walsh        return False
60*7423c01aSMichael Walsh
61*7423c01aSMichael Walsh    # Assertion: We have an invalid_values list.  Processing it now.
62*7423c01aSMichael Walsh    if var_value not in invalid_values:
63*7423c01aSMichael Walsh        return True
64*7423c01aSMichael Walsh
65*7423c01aSMichael Walsh    var_name = gp.get_arg_name(0, 1, 2)
66*7423c01aSMichael Walsh    gp.print_error_report("The following variable has an invalid value:\n" +
67*7423c01aSMichael Walsh                          gp.sprint_varx(var_name, var_value) + "\nIt must" +
68*7423c01aSMichael Walsh                          " NOT be one of the following values:\n" +
69*7423c01aSMichael Walsh                          gp.sprint_varx("invalid_values", invalid_values))
70*7423c01aSMichael Walsh    return False
71*7423c01aSMichael Walsh
72*7423c01aSMichael Walsh###############################################################################
73*7423c01aSMichael Walsh
74*7423c01aSMichael Walsh
75*7423c01aSMichael Walsh###############################################################################
76*7423c01aSMichael Walshdef valid_integer(var_value):
77*7423c01aSMichael Walsh
78*7423c01aSMichael Walsh    r"""
79*7423c01aSMichael Walsh    Return True if var_value is a valid integer.  Otherwise, return False and
80*7423c01aSMichael Walsh    print an error message to stderr.
81*7423c01aSMichael Walsh
82*7423c01aSMichael Walsh    Description of arguments:
83*7423c01aSMichael Walsh    var_value                       The value being validated.
84*7423c01aSMichael Walsh    """
85*7423c01aSMichael Walsh
86*7423c01aSMichael Walsh    # This currently allows floats which is not good.
87*7423c01aSMichael Walsh
88*7423c01aSMichael Walsh    try:
89*7423c01aSMichael Walsh        if type(int(var_value)) is int:
90*7423c01aSMichael Walsh            return True
91*7423c01aSMichael Walsh    except ValueError:
92*7423c01aSMichael Walsh        pass
93*7423c01aSMichael Walsh
94*7423c01aSMichael Walsh    # If we get to this point, the validation has failed.
95*7423c01aSMichael Walsh
96*7423c01aSMichael Walsh    var_name = gp.get_arg_name(0, 1, 2)
97*7423c01aSMichael Walsh    gp.print_varx("var_name", var_name)
98*7423c01aSMichael Walsh
99*7423c01aSMichael Walsh    gp.print_error_report("Invalid integer value:\n" +
100*7423c01aSMichael Walsh                          gp.sprint_varx(var_name, var_value))
101*7423c01aSMichael Walsh
102*7423c01aSMichael Walsh    return False
103*7423c01aSMichael Walsh
104*7423c01aSMichael Walsh###############################################################################
105