1*6b3a42afSjmmv // Copyright 2010 Google Inc.
2*6b3a42afSjmmv // All rights reserved.
3*6b3a42afSjmmv //
4*6b3a42afSjmmv // Redistribution and use in source and binary forms, with or without
5*6b3a42afSjmmv // modification, are permitted provided that the following conditions are
6*6b3a42afSjmmv // met:
7*6b3a42afSjmmv //
8*6b3a42afSjmmv // * Redistributions of source code must retain the above copyright
9*6b3a42afSjmmv // notice, this list of conditions and the following disclaimer.
10*6b3a42afSjmmv // * Redistributions in binary form must reproduce the above copyright
11*6b3a42afSjmmv // notice, this list of conditions and the following disclaimer in the
12*6b3a42afSjmmv // documentation and/or other materials provided with the distribution.
13*6b3a42afSjmmv // * Neither the name of Google Inc. nor the names of its contributors
14*6b3a42afSjmmv // may be used to endorse or promote products derived from this software
15*6b3a42afSjmmv // without specific prior written permission.
16*6b3a42afSjmmv //
17*6b3a42afSjmmv // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18*6b3a42afSjmmv // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19*6b3a42afSjmmv // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20*6b3a42afSjmmv // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21*6b3a42afSjmmv // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22*6b3a42afSjmmv // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23*6b3a42afSjmmv // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24*6b3a42afSjmmv // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25*6b3a42afSjmmv // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26*6b3a42afSjmmv // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27*6b3a42afSjmmv // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*6b3a42afSjmmv
29*6b3a42afSjmmv #include "utils/cmdline/exceptions.hpp"
30*6b3a42afSjmmv
31*6b3a42afSjmmv #include "utils/format/macros.hpp"
32*6b3a42afSjmmv #include "utils/sanity.hpp"
33*6b3a42afSjmmv
34*6b3a42afSjmmv namespace cmdline = utils::cmdline;
35*6b3a42afSjmmv
36*6b3a42afSjmmv
37*6b3a42afSjmmv #define VALIDATE_OPTION_NAME(option) PRE_MSG( \
38*6b3a42afSjmmv (option.length() == 2 && (option[0] == '-' && option[1] != '-')) || \
39*6b3a42afSjmmv (option.length() > 2 && (option[0] == '-' && option[1] == '-')), \
40*6b3a42afSjmmv F("The option name %s must be fully specified") % option);
41*6b3a42afSjmmv
42*6b3a42afSjmmv
43*6b3a42afSjmmv /// Constructs a new error with a plain-text message.
44*6b3a42afSjmmv ///
45*6b3a42afSjmmv /// \param message The plain-text error message.
error(const std::string & message)46*6b3a42afSjmmv cmdline::error::error(const std::string& message) :
47*6b3a42afSjmmv std::runtime_error(message)
48*6b3a42afSjmmv {
49*6b3a42afSjmmv }
50*6b3a42afSjmmv
51*6b3a42afSjmmv
52*6b3a42afSjmmv /// Destructor for the error.
~error(void)53*6b3a42afSjmmv cmdline::error::~error(void) throw()
54*6b3a42afSjmmv {
55*6b3a42afSjmmv }
56*6b3a42afSjmmv
57*6b3a42afSjmmv
58*6b3a42afSjmmv /// Constructs a new usage_error.
59*6b3a42afSjmmv ///
60*6b3a42afSjmmv /// \param message The reason behind the usage error.
usage_error(const std::string & message)61*6b3a42afSjmmv cmdline::usage_error::usage_error(const std::string& message) :
62*6b3a42afSjmmv error(message)
63*6b3a42afSjmmv {
64*6b3a42afSjmmv }
65*6b3a42afSjmmv
66*6b3a42afSjmmv
67*6b3a42afSjmmv /// Destructor for the error.
~usage_error(void)68*6b3a42afSjmmv cmdline::usage_error::~usage_error(void) throw()
69*6b3a42afSjmmv {
70*6b3a42afSjmmv }
71*6b3a42afSjmmv
72*6b3a42afSjmmv
73*6b3a42afSjmmv /// Constructs a new missing_option_argument_error.
74*6b3a42afSjmmv ///
75*6b3a42afSjmmv /// \param option_ The option for which no argument was provided. The option
76*6b3a42afSjmmv /// name must be fully specified (with - or -- in front).
missing_option_argument_error(const std::string & option_)77*6b3a42afSjmmv cmdline::missing_option_argument_error::missing_option_argument_error(
78*6b3a42afSjmmv const std::string& option_) :
79*6b3a42afSjmmv usage_error(F("Missing required argument for option %s") % option_),
80*6b3a42afSjmmv _option(option_)
81*6b3a42afSjmmv {
82*6b3a42afSjmmv VALIDATE_OPTION_NAME(option_);
83*6b3a42afSjmmv }
84*6b3a42afSjmmv
85*6b3a42afSjmmv
86*6b3a42afSjmmv /// Destructor for the error.
~missing_option_argument_error(void)87*6b3a42afSjmmv cmdline::missing_option_argument_error::~missing_option_argument_error(void)
88*6b3a42afSjmmv throw()
89*6b3a42afSjmmv {
90*6b3a42afSjmmv }
91*6b3a42afSjmmv
92*6b3a42afSjmmv
93*6b3a42afSjmmv /// Returns the option name for which no argument was provided.
94*6b3a42afSjmmv ///
95*6b3a42afSjmmv /// \return The option name.
96*6b3a42afSjmmv const std::string&
option(void) const97*6b3a42afSjmmv cmdline::missing_option_argument_error::option(void) const
98*6b3a42afSjmmv {
99*6b3a42afSjmmv return _option;
100*6b3a42afSjmmv }
101*6b3a42afSjmmv
102*6b3a42afSjmmv
103*6b3a42afSjmmv /// Constructs a new option_argument_value_error.
104*6b3a42afSjmmv ///
105*6b3a42afSjmmv /// \param option_ The option to which an invalid argument was passed. The
106*6b3a42afSjmmv /// option name must be fully specified (with - or -- in front).
107*6b3a42afSjmmv /// \param argument_ The invalid argument.
108*6b3a42afSjmmv /// \param reason_ The reason describing why the argument is invalid.
option_argument_value_error(const std::string & option_,const std::string & argument_,const std::string & reason_)109*6b3a42afSjmmv cmdline::option_argument_value_error::option_argument_value_error(
110*6b3a42afSjmmv const std::string& option_, const std::string& argument_,
111*6b3a42afSjmmv const std::string& reason_) :
112*6b3a42afSjmmv usage_error(F("Invalid argument '%s' for option %s: %s") % argument_ %
113*6b3a42afSjmmv option_ % reason_),
114*6b3a42afSjmmv _option(option_),
115*6b3a42afSjmmv _argument(argument_),
116*6b3a42afSjmmv _reason(reason_)
117*6b3a42afSjmmv {
118*6b3a42afSjmmv VALIDATE_OPTION_NAME(option_);
119*6b3a42afSjmmv }
120*6b3a42afSjmmv
121*6b3a42afSjmmv
122*6b3a42afSjmmv /// Destructor for the error.
~option_argument_value_error(void)123*6b3a42afSjmmv cmdline::option_argument_value_error::~option_argument_value_error(void)
124*6b3a42afSjmmv throw()
125*6b3a42afSjmmv {
126*6b3a42afSjmmv }
127*6b3a42afSjmmv
128*6b3a42afSjmmv
129*6b3a42afSjmmv /// Returns the option to which the invalid argument was passed.
130*6b3a42afSjmmv ///
131*6b3a42afSjmmv /// \return The option name.
132*6b3a42afSjmmv const std::string&
option(void) const133*6b3a42afSjmmv cmdline::option_argument_value_error::option(void) const
134*6b3a42afSjmmv {
135*6b3a42afSjmmv return _option;
136*6b3a42afSjmmv }
137*6b3a42afSjmmv
138*6b3a42afSjmmv
139*6b3a42afSjmmv /// Returns the invalid argument value.
140*6b3a42afSjmmv ///
141*6b3a42afSjmmv /// \return The invalid argument.
142*6b3a42afSjmmv const std::string&
argument(void) const143*6b3a42afSjmmv cmdline::option_argument_value_error::argument(void) const
144*6b3a42afSjmmv {
145*6b3a42afSjmmv return _argument;
146*6b3a42afSjmmv }
147*6b3a42afSjmmv
148*6b3a42afSjmmv
149*6b3a42afSjmmv /// Constructs a new unknown_option_error.
150*6b3a42afSjmmv ///
151*6b3a42afSjmmv /// \param option_ The unknown option. The option name must be fully specified
152*6b3a42afSjmmv /// (with - or -- in front).
unknown_option_error(const std::string & option_)153*6b3a42afSjmmv cmdline::unknown_option_error::unknown_option_error(
154*6b3a42afSjmmv const std::string& option_) :
155*6b3a42afSjmmv usage_error(F("Unknown option %s") % option_),
156*6b3a42afSjmmv _option(option_)
157*6b3a42afSjmmv {
158*6b3a42afSjmmv VALIDATE_OPTION_NAME(option_);
159*6b3a42afSjmmv }
160*6b3a42afSjmmv
161*6b3a42afSjmmv
162*6b3a42afSjmmv /// Destructor for the error.
~unknown_option_error(void)163*6b3a42afSjmmv cmdline::unknown_option_error::~unknown_option_error(void) throw()
164*6b3a42afSjmmv {
165*6b3a42afSjmmv }
166*6b3a42afSjmmv
167*6b3a42afSjmmv
168*6b3a42afSjmmv /// Returns the unknown option name.
169*6b3a42afSjmmv ///
170*6b3a42afSjmmv /// \return The unknown option.
171*6b3a42afSjmmv const std::string&
option(void) const172*6b3a42afSjmmv cmdline::unknown_option_error::option(void) const
173*6b3a42afSjmmv {
174*6b3a42afSjmmv return _option;
175*6b3a42afSjmmv }
176