| Directory: | ./ |
|---|---|
| File: | src/Option.cpp |
| Date: | 2024-12-09 15:28:54 |
| Exec | Total | Coverage | |
|---|---|---|---|
| Lines: | 163 | 191 | 85.3% |
| Branches: | 117 | 202 | 57.9% |
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | /*************************************** | ||
| 2 | Auteur : Pierre Aubert | ||
| 3 | Mail : pierre.aubert@lapp.in2p3.fr | ||
| 4 | Licence : CeCILL-C | ||
| 5 | ****************************************/ | ||
| 6 | |||
| 7 | #include "string_utils.h" | ||
| 8 | #include "Option.h" | ||
| 9 | |||
| 10 | ///Default constructor of Option | ||
| 11 | /** @param longName : long name of the option | ||
| 12 | * @param shortName : long name of the option | ||
| 13 | * @param docString : documentation string of the Option | ||
| 14 | */ | ||
| 15 | 35 | Option::Option(const std::string & longName, const std::string & shortName, const std::string & docString) | |
| 16 |
4/4✓ Branch 2 taken 35 times.
✓ Branch 6 taken 35 times.
✓ Branch 9 taken 35 times.
✓ Branch 14 taken 35 times.
|
35 | :p_longName(longName), p_shortName(shortName), p_value(""), p_isRequired(false), p_docString(docString) |
| 17 | { | ||
| 18 |
1/1✓ Branch 1 taken 35 times.
|
35 | initialisationOption(); |
| 19 | 35 | } | |
| 20 | |||
| 21 | ///Constructor of Option | ||
| 22 | /** @param longName : long name of the option | ||
| 23 | * @param shortName : long name of the option | ||
| 24 | * @param value : value of the Option | ||
| 25 | * @param docString : documentation string of the Option | ||
| 26 | */ | ||
| 27 | ✗ | Option::Option(const std::string & longName, const std::string & shortName, const OptionValue & value, const std::string & docString) | |
| 28 | ✗ | :p_longName(longName), p_shortName(shortName), p_value(value), p_isRequired(false), p_docString(docString) | |
| 29 | { | ||
| 30 | ✗ | initialisationOption(); | |
| 31 | } | ||
| 32 | |||
| 33 | ///Constructor of Option | ||
| 34 | /** @param longName : long name of the option | ||
| 35 | * @param shortName : long name of the option | ||
| 36 | * @param value : value of the Option | ||
| 37 | * @param isRequired : true if the option is required, false if it is optionnal | ||
| 38 | * @param docString : documentation string of the Option | ||
| 39 | */ | ||
| 40 | 167 | Option::Option(const std::string & longName, const std::string & shortName, const OptionValue & value, bool isRequired, const std::string & docString) | |
| 41 |
3/3✓ Branch 2 taken 167 times.
✓ Branch 5 taken 167 times.
✓ Branch 8 taken 167 times.
|
167 | :p_longName(longName), p_shortName(shortName), p_value(value), p_isRequired(isRequired), p_docString(docString) |
| 42 | { | ||
| 43 |
1/1✓ Branch 1 taken 167 times.
|
167 | initialisationOption(); |
| 44 | 167 | } | |
| 45 | |||
| 46 | ///Constructor of Option | ||
| 47 | /** @param longName : long name of the option | ||
| 48 | * @param shortName : long name of the option | ||
| 49 | * @param isRequired : true if the option is required, false if it is optionnal | ||
| 50 | * @param docString : documentation string of the Option | ||
| 51 | */ | ||
| 52 | 2 | Option::Option(const std::string & longName, const std::string & shortName, bool isRequired, const std::string & docString) | |
| 53 |
3/3✓ Branch 2 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
|
2 | :p_longName(longName), p_shortName(shortName), p_isRequired(isRequired), p_docString(docString) |
| 54 | { | ||
| 55 |
1/1✓ Branch 1 taken 2 times.
|
2 | initialisationOption(); |
| 56 | 2 | } | |
| 57 | |||
| 58 | ///Copy constructor of Option | ||
| 59 | /** @param other : class to copy | ||
| 60 | */ | ||
| 61 |
1/1✓ Branch 3 taken 387 times.
|
387 | Option::Option(const Option & other){ |
| 62 |
1/1✓ Branch 1 taken 387 times.
|
387 | copyOption(other); |
| 63 | 387 | } | |
| 64 | |||
| 65 | ///Destructeur of Option | ||
| 66 | 986 | Option::~Option(){ | |
| 67 | |||
| 68 | } | ||
| 69 | |||
| 70 | ///Definition of equal operator of Option | ||
| 71 | /** @param other : class to copy | ||
| 72 | * @return copied class | ||
| 73 | */ | ||
| 74 | 34 | Option & Option::operator = (const Option & other){ | |
| 75 | 34 | copyOption(other); | |
| 76 | 34 | return *this; | |
| 77 | } | ||
| 78 | |||
| 79 | ///Parse the current option with the given parser | ||
| 80 | /** @param[out] parser : parser of the given arguments to the program | ||
| 81 | * @return true on success, false otherwise | ||
| 82 | */ | ||
| 83 | 63 | bool Option::parseOption(ArgParser & parser){ | |
| 84 |
4/4✓ Branch 2 taken 63 times.
✓ Branch 5 taken 61 times.
✓ Branch 9 taken 20 times.
✓ Branch 10 taken 41 times.
|
67 | if(parsePartOption(parser, "--", p_longName)){return true;} |
| 85 |
4/4✓ Branch 2 taken 41 times.
✓ Branch 5 taken 41 times.
✓ Branch 9 taken 19 times.
✓ Branch 10 taken 22 times.
|
41 | else if(parsePartOption(parser, "-", p_shortName)){return true;} |
| 86 | 22 | return false; | |
| 87 | } | ||
| 88 | |||
| 89 | ///Print a vector of value | ||
| 90 | /** @param vecValue : vector of value to be ploted | ||
| 91 | */ | ||
| 92 | 9 | void printVecString(const VecValue & vecValue){ | |
| 93 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 9 times.
|
9 | if(vecValue.size() == 0lu){return;} |
| 94 | 9 | VecValue::const_iterator it(vecValue.begin()); | |
| 95 |
1/1✓ Branch 2 taken 9 times.
|
9 | std::cout << *it; |
| 96 | 9 | ++it; | |
| 97 |
1/2✗ Branch 2 not taken.
✓ Branch 3 taken 9 times.
|
9 | while(it != vecValue.end()){ |
| 98 | ✗ | std::cout << ", " << *it; | |
| 99 | ✗ | ++it; | |
| 100 | } | ||
| 101 | } | ||
| 102 | |||
| 103 | ///Print an option | ||
| 104 | /** @param indentation : indentation to print the option | ||
| 105 | */ | ||
| 106 | 38 | void Option::print(const std::string & indentation) const{ | |
| 107 | 38 | OptionType::OptionType type(p_value.getType()); | |
| 108 | 38 | std::cout << indentation; | |
| 109 |
1/2✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
|
38 | if(p_longName != ""){ |
| 110 | 38 | std::cout << "--" << p_longName; | |
| 111 |
2/2✓ Branch 0 taken 37 times.
✓ Branch 1 taken 1 times.
|
38 | if(type != OptionType::NONE){ |
| 112 |
1/1✓ Branch 3 taken 37 times.
|
37 | std::cout << "=" << convertOptionTypeToString(type); |
| 113 | } | ||
| 114 | } | ||
| 115 |
1/2✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
|
38 | if(p_shortName != ""){ |
| 116 |
1/2✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
|
38 | if(p_longName != ""){std::cout << " , ";} |
| 117 | 38 | std::cout << "-" << p_shortName; | |
| 118 |
2/2✓ Branch 0 taken 37 times.
✓ Branch 1 taken 1 times.
|
38 | if(type != OptionType::NONE){ |
| 119 |
1/1✓ Branch 3 taken 37 times.
|
37 | std::cout << " " << convertOptionTypeToString(type); |
| 120 | } | ||
| 121 | } | ||
| 122 |
1/2✓ Branch 1 taken 38 times.
✗ Branch 2 not taken.
|
38 | if(p_docString != ""){ |
| 123 | 38 | std::cout << " : " << p_docString; | |
| 124 | } | ||
| 125 | 38 | std::cout << std::endl; | |
| 126 | 38 | const VecValue & vecDefaultValue = p_value.getDefaultValue(); | |
| 127 |
2/2✓ Branch 1 taken 9 times.
✓ Branch 2 taken 29 times.
|
38 | if(vecDefaultValue.size()){ |
| 128 | 9 | std::cout << indentation << "\tDefault value : '"; | |
| 129 | 9 | printVecString(vecDefaultValue); | |
| 130 | 9 | std::cout << "'" << std::endl; | |
| 131 | } | ||
| 132 | 38 | const VecValue & vecPossibleValue = p_value.getPossibleValue(); | |
| 133 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 38 times.
|
38 | if(vecPossibleValue.size()){ |
| 134 | ✗ | std::cout << indentation << "\tPossible values : "; | |
| 135 | ✗ | printVecString(vecPossibleValue); | |
| 136 | ✗ | std::cout << std::endl; | |
| 137 | } | ||
| 138 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 38 times.
|
38 | if(p_isRequired){std::cout << indentation << "\tThis argument has to be set" << std::endl;} |
| 139 | 38 | else{std::cout << indentation << "\tThis argument is optional" << std::endl;} | |
| 140 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 38 times.
|
38 | if(p_isAllowEmpty){std::cout << indentation << "\tThis argument can have an empty value" << std::endl;} |
| 141 | 38 | else{std::cout << indentation << "\tThis argument cannot have an empty value" << std::endl;} | |
| 142 | 38 | } | |
| 143 | |||
| 144 | ///Set the long name of the option | ||
| 145 | /** @param longName : long name of the option | ||
| 146 | */ | ||
| 147 | 1 | void Option::setLongName(const std::string & longName){p_longName = longName;} | |
| 148 | |||
| 149 | ///Set the short name of the option | ||
| 150 | /** @param shortName : short name of the option | ||
| 151 | */ | ||
| 152 | 1 | void Option::setShortName(const std::string & shortName){p_shortName = shortName;} | |
| 153 | |||
| 154 | ///Set the value of the option | ||
| 155 | /** @param value : value name of the option | ||
| 156 | */ | ||
| 157 | 1 | void Option::setValue(const OptionValue & value){p_value = value;} | |
| 158 | |||
| 159 | ///Set if the option is required | ||
| 160 | /** @param isRequired : true if the Option is required, false if it is optionnal | ||
| 161 | */ | ||
| 162 | 1 | void Option::setIsRequired(bool isRequired){p_isRequired = isRequired;} | |
| 163 | |||
| 164 | ///Set the documentation string of the Option | ||
| 165 | /** @param docString : documentation string of the Option | ||
| 166 | */ | ||
| 167 | 1 | void Option::setDocString(const std::string & docString){p_docString = docString;} | |
| 168 | |||
| 169 | ///Say if the Option has been parsed or not | ||
| 170 | /** @param isParsed : true if the Option has been parsed, false if not | ||
| 171 | */ | ||
| 172 | 1 | void Option::setIsParsed(bool isParsed){p_isParsed = isParsed;} | |
| 173 | |||
| 174 | ///Say if the option can be empty or not | ||
| 175 | /** @param isAllowEmpty : true if the option can be empty, false otherwise | ||
| 176 | */ | ||
| 177 | 124 | void Option::setIsAllowEmpty(bool isAllowEmpty){p_isAllowEmpty = isAllowEmpty;} | |
| 178 | |||
| 179 | ///Get the long name of the Option | ||
| 180 | /** @return long name of the Option | ||
| 181 | */ | ||
| 182 | 159 | const std::string & Option::getLongName() const{return p_longName;} | |
| 183 | |||
| 184 | ///Get the long name of the Option | ||
| 185 | /** @return long name of the Option | ||
| 186 | */ | ||
| 187 | 1 | std::string & Option::getLongName(){return p_longName;} | |
| 188 | |||
| 189 | ///Get the short name of the Option | ||
| 190 | /** @return short name of the Option | ||
| 191 | */ | ||
| 192 | 81 | const std::string & Option::getShortName() const{return p_shortName;} | |
| 193 | |||
| 194 | ///Get the short name of the Option | ||
| 195 | /** @return short name of the Option | ||
| 196 | */ | ||
| 197 | 1 | std::string & Option::getShortName(){return p_shortName;} | |
| 198 | |||
| 199 | ///Get the value of the Option | ||
| 200 | /** @return value of the Option | ||
| 201 | */ | ||
| 202 | 3 | const OptionValue & Option::getValue() const{return p_value;} | |
| 203 | |||
| 204 | ///Get the value of the Option | ||
| 205 | /** @return value of the Option | ||
| 206 | */ | ||
| 207 | 35 | OptionValue & Option::getValue(){return p_value;} | |
| 208 | |||
| 209 | ///Get if the option is required | ||
| 210 | /** @return true if the Option is required, false if it is optionnal | ||
| 211 | */ | ||
| 212 | 3 | bool Option::isRequired() const{return p_isRequired;} | |
| 213 | |||
| 214 | ///Get if the option is required | ||
| 215 | /** @return true if the Option is required, false if it is optionnal | ||
| 216 | */ | ||
| 217 | 9 | bool & Option::isRequired(){return p_isRequired;} | |
| 218 | |||
| 219 | ///Get if the option value can be empty | ||
| 220 | /** @return true if the option value can be empty, false otherwise | ||
| 221 | */ | ||
| 222 | 3 | bool Option::isAllowEmpty() const{return p_isAllowEmpty;} | |
| 223 | |||
| 224 | ///Get if the option value can be empty | ||
| 225 | /** @return true if the option value can be empty, false otherwise | ||
| 226 | */ | ||
| 227 | 1 | bool & Option::isAllowEmpty(){return p_isAllowEmpty;} | |
| 228 | |||
| 229 | ///Get the documentation string of the Option | ||
| 230 | /** @return documentation string of the Option | ||
| 231 | */ | ||
| 232 | 3 | const std::string & Option::getDocString() const{return p_docString;} | |
| 233 | |||
| 234 | ///Get the documentation string of the Option | ||
| 235 | /** @return documentation string of the Option | ||
| 236 | */ | ||
| 237 | 1 | std::string & Option::getDocString(){return p_docString;} | |
| 238 | |||
| 239 | ///Say if the Option has been parsed or not | ||
| 240 | /** @return true if the Option has been parsed, false if not | ||
| 241 | */ | ||
| 242 | 5 | bool Option::isParsed() const{return p_isParsed;} | |
| 243 | |||
| 244 | ///Say if the Option has been parsed or not | ||
| 245 | /** @return true if the Option has been parsed, false if not | ||
| 246 | */ | ||
| 247 | 68 | bool & Option::isParsed(){return p_isParsed;} | |
| 248 | |||
| 249 | ///Check the argument of the parser | ||
| 250 | /** @return true if the arguments is required and is set, false otherwise | ||
| 251 | */ | ||
| 252 | 50 | bool Option::checkArgument() const{ | |
| 253 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 50 times.
|
50 | if(p_isRequired){ |
| 254 | ✗ | if(!p_isParsed){ | |
| 255 | ✗ | OptionType::OptionType type(p_value.getType()); | |
| 256 | ✗ | std::cerr << termRed() << "Missing arguement "; | |
| 257 | ✗ | if(p_longName != ""){ | |
| 258 | ✗ | std::cerr << "--" << p_longName; | |
| 259 | ✗ | if(type != OptionType::NONE){ | |
| 260 | ✗ | std::cout << "=" << convertOptionTypeToString(type); | |
| 261 | } | ||
| 262 | } | ||
| 263 | ✗ | if(p_shortName != ""){ | |
| 264 | ✗ | if(p_longName != ""){std::cerr << " , ";} | |
| 265 | ✗ | std::cerr << "-" << p_shortName; | |
| 266 | ✗ | if(type != OptionType::NONE){ | |
| 267 | ✗ | std::cout << " " << convertOptionTypeToString(type); | |
| 268 | } | ||
| 269 | } | ||
| 270 | ✗ | std::cerr << termDefault() << std::endl; | |
| 271 | } | ||
| 272 | ✗ | return p_isParsed; | |
| 273 | 50 | }else{return true;} | |
| 274 | } | ||
| 275 | |||
| 276 | ///Get the possible options for the bash completion | ||
| 277 | /** @param[out] possibleOption : possible options for the bash completion | ||
| 278 | * @param cursorOption : option of the cursor which is currently completed | ||
| 279 | */ | ||
| 280 | 27 | void Option::getPossibleOption(std::string & possibleOption, const std::string & cursorOption) const{ | |
| 281 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 23 times.
|
27 | if(p_isParsed){return;} |
| 282 |
1/2✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
|
23 | if(p_longName != ""){ |
| 283 |
1/1✓ Branch 1 taken 23 times.
|
23 | std::string longOption("--" + p_longName); |
| 284 |
2/2✓ Branch 1 taken 5 times.
✓ Branch 2 taken 18 times.
|
23 | if(cursorOption == ""){ |
| 285 |
2/2✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
|
5 | possibleOption += longOption + " "; |
| 286 | }else{ | ||
| 287 |
3/3✓ Branch 1 taken 18 times.
✓ Branch 3 taken 16 times.
✓ Branch 4 taken 2 times.
|
18 | if(isSameBegining(longOption, cursorOption)){ |
| 288 |
2/2✓ Branch 1 taken 16 times.
✓ Branch 4 taken 16 times.
|
16 | possibleOption += longOption + " "; |
| 289 | } | ||
| 290 | } | ||
| 291 | 23 | } | |
| 292 |
1/2✓ Branch 1 taken 23 times.
✗ Branch 2 not taken.
|
23 | if(p_shortName != ""){ |
| 293 |
1/1✓ Branch 1 taken 23 times.
|
23 | std::string shortOption("-" + p_shortName); |
| 294 |
2/2✓ Branch 1 taken 5 times.
✓ Branch 2 taken 18 times.
|
23 | if(cursorOption == ""){ |
| 295 |
2/2✓ Branch 1 taken 5 times.
✓ Branch 4 taken 5 times.
|
5 | possibleOption += shortOption + " "; |
| 296 | }else{ | ||
| 297 |
3/3✓ Branch 1 taken 18 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 14 times.
|
18 | if(isSameBegining(shortOption, cursorOption)){ |
| 298 |
2/2✓ Branch 1 taken 4 times.
✓ Branch 4 taken 4 times.
|
4 | possibleOption += shortOption + " "; |
| 299 | } | ||
| 300 | } | ||
| 301 | 23 | } | |
| 302 | } | ||
| 303 | |||
| 304 | ///Complete the possible values of the Option | ||
| 305 | /** @param[out] possibleValue : possible value of the option | ||
| 306 | * @param cursorOption : option of the cursor which is currently completed | ||
| 307 | */ | ||
| 308 | 8 | void Option::getPossibleValue(std::string & possibleValue, const std::string & cursorOption) const{ | |
| 309 | 8 | p_value.bashCompletionValue(possibleValue, cursorOption); | |
| 310 | 8 | } | |
| 311 | |||
| 312 | ///Copy function of Option | ||
| 313 | /** @param other : class to copy | ||
| 314 | */ | ||
| 315 | 421 | void Option::copyOption(const Option & other){ | |
| 316 | 421 | p_longName = other.p_longName; | |
| 317 | 421 | p_shortName = other.p_shortName; | |
| 318 | 421 | p_value = other.p_value; | |
| 319 | 421 | p_isRequired = other.p_isRequired; | |
| 320 | 421 | p_docString = other.p_docString; | |
| 321 | 421 | p_isParsed = other.p_isParsed; | |
| 322 | 421 | p_firstPartParsedOption = other.p_firstPartParsedOption; | |
| 323 | 421 | p_isAllowEmpty = other.p_isAllowEmpty; | |
| 324 | 421 | } | |
| 325 | |||
| 326 | ///Initialisation function of the class Option | ||
| 327 | 204 | void Option::initialisationOption(){ | |
| 328 | 204 | p_isParsed = false; | |
| 329 | 204 | p_isRequired = false; | |
| 330 | 204 | p_firstPartParsedOption = ""; | |
| 331 | 204 | p_isAllowEmpty = false; | |
| 332 | 204 | } | |
| 333 | |||
| 334 | ///Parse the given option with the parser | ||
| 335 | /** @param[out] parser : parser to be used | ||
| 336 | * @param prefix : option prefix (- or -- or nothing) | ||
| 337 | * @param optionName : name of hte option to be parsed | ||
| 338 | * @return true on success, false otherwise | ||
| 339 | */ | ||
| 340 | 104 | bool Option::parsePartOption(ArgParser & parser, const std::string & prefix, const std::string & optionName){ | |
| 341 |
2/3✓ Branch 1 taken 104 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 104 times.
|
104 | if(parser.isEndOfOption()){return true;} |
| 342 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 104 times.
|
104 | if(optionName == ""){return false;} |
| 343 |
1/1✓ Branch 1 taken 104 times.
|
104 | std::string & currentOption = parser.getCurrentOption(); |
| 344 |
1/1✓ Branch 1 taken 104 times.
|
104 | std::string longOption(prefix + optionName); |
| 345 | 104 | size_t sizeLongOption(longOption.size()); | |
| 346 |
1/1✓ Branch 1 taken 104 times.
|
104 | OptionType::OptionType optionType = p_value.getType(); |
| 347 |
2/2✓ Branch 1 taken 28 times.
✓ Branch 2 taken 76 times.
|
104 | if(currentOption == longOption){ |
| 348 |
1/1✓ Branch 1 taken 28 times.
|
28 | checkAlreadyParsed(longOption); |
| 349 | 28 | p_isParsed = true; | |
| 350 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 26 times.
|
28 | if(optionType == OptionType::NONE){ //No value expected |
| 351 |
1/1✓ Branch 1 taken 2 times.
|
2 | parser.getNextOption(); |
| 352 | 2 | return true; //Option found | |
| 353 | } | ||
| 354 | 26 | bool valueOk(true), isInitialised(false); | |
| 355 |
1/1✓ Branch 1 taken 26 times.
|
26 | parser.getNextOption(); |
| 356 |
7/7✓ Branch 1 taken 56 times.
✓ Branch 3 taken 34 times.
✓ Branch 4 taken 22 times.
✓ Branch 5 taken 30 times.
✓ Branch 6 taken 4 times.
✓ Branch 7 taken 30 times.
✓ Branch 8 taken 26 times.
|
56 | while(!parser.isEndOfOption() && valueOk){ |
| 357 |
1/1✓ Branch 1 taken 30 times.
|
30 | std::string & currentOption = parser.getCurrentOption(); |
| 358 |
2/2✓ Branch 1 taken 1 times.
✓ Branch 2 taken 29 times.
|
30 | if(currentOption == ""){ |
| 359 |
1/2✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
|
1 | if(optionType == OptionType::STRING){ |
| 360 |
2/2✓ Branch 2 taken 1 times.
✓ Branch 5 taken 1 times.
|
1 | p_value.addValue(""); |
| 361 |
1/1✓ Branch 1 taken 1 times.
|
1 | parser.getNextOption(); |
| 362 | 1 | valueOk = true; | |
| 363 | 1 | isInitialised = true; | |
| 364 | }else{ | ||
| 365 | ✗ | throw std::runtime_error("Option::parsePartOption : pass empty value to option '" + longOption + "' which does not expect STRING"); | |
| 366 | } | ||
| 367 | }else{ | ||
| 368 |
3/3✓ Branch 1 taken 29 times.
✓ Branch 3 taken 4 times.
✓ Branch 4 taken 25 times.
|
29 | if(currentOption[0] == '-'){ |
| 369 | 4 | valueOk = false; | |
| 370 | }else{ | ||
| 371 |
1/1✓ Branch 1 taken 25 times.
|
25 | p_value.addValue(currentOption); |
| 372 |
1/1✓ Branch 1 taken 25 times.
|
25 | parser.getNextOption(); |
| 373 | 25 | valueOk = true; | |
| 374 | 25 | isInitialised = true; | |
| 375 | } | ||
| 376 | } | ||
| 377 | } | ||
| 378 |
3/4✓ Branch 0 taken 2 times.
✓ Branch 1 taken 24 times.
✓ Branch 2 taken 2 times.
✗ Branch 3 not taken.
|
26 | if(!isInitialised && !p_isAllowEmpty){ |
| 379 |
3/3✓ Branch 2 taken 2 times.
✓ Branch 5 taken 2 times.
✓ Branch 8 taken 2 times.
|
2 | throw std::runtime_error("Option::parsePartOption : expect value after option '" + longOption + "'"); |
| 380 | } | ||
| 381 |
1/4✗ Branch 0 not taken.
✓ Branch 1 taken 24 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
24 | return isInitialised || p_isAllowEmpty; |
| 382 |
3/3✓ Branch 1 taken 76 times.
✓ Branch 3 taken 13 times.
✓ Branch 4 taken 63 times.
|
76 | }else if(isSameBegining(currentOption, longOption)){ |
| 383 |
2/3✓ Branch 1 taken 13 times.
✓ Branch 3 taken 13 times.
✗ Branch 4 not taken.
|
13 | if(currentOption[sizeLongOption] == '='){ |
| 384 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 13 times.
|
13 | if(optionType == OptionType::NONE){ //No value expected |
| 385 | ✗ | throw std::runtime_error("Option::parsePartOption : the option '"+currentOption+"' does not have value"); | |
| 386 | } | ||
| 387 |
1/2✗ Branch 1 not taken.
✓ Branch 2 taken 13 times.
|
13 | if(currentOption.size() == sizeLongOption + 1lu){ |
| 388 | ✗ | p_firstPartParsedOption = longOption + "="; | |
| 389 | ✗ | throw std::runtime_error("Option::parsePartOption : problem with the option '"+currentOption+"' because it ends with a '=' and not a value"); | |
| 390 | //Ici il faut un mode qui renvoie quand même les valeurs possibles quand on a --option=... | ||
| 391 | } | ||
| 392 |
1/1✓ Branch 1 taken 13 times.
|
13 | checkAlreadyParsed(longOption); |
| 393 |
1/1✓ Branch 1 taken 13 times.
|
13 | std::string value(currentOption.substr(sizeLongOption + 1lu)); |
| 394 |
1/1✓ Branch 1 taken 13 times.
|
13 | p_value.addValue(value); |
| 395 | 13 | p_isParsed = true; | |
| 396 |
1/1✓ Branch 1 taken 13 times.
|
13 | parser.getNextOption(); |
| 397 | 13 | return true; | |
| 398 | 13 | }else{ | |
| 399 | ✗ | return false; //It is an option with a longer name | |
| 400 | } | ||
| 401 | } | ||
| 402 | 63 | return false; | |
| 403 | 104 | } | |
| 404 | |||
| 405 | ///Check if the Option has been already parsed | ||
| 406 | /** @param longOption : used option | ||
| 407 | */ | ||
| 408 | 41 | void Option::checkAlreadyParsed(const std::string & longOption){ | |
| 409 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 41 times.
|
41 | if(p_isParsed){ //The option has already been parsed, there is a mistake |
| 410 | ✗ | throw std::runtime_error("Option::checkAlreadyParsed : option '" + longOption + "' already exists"); | |
| 411 | } | ||
| 412 | 41 | } | |
| 413 | |||
| 414 | |||
| 415 | |||
| 416 | |||
| 417 |