X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=include%2Foption.h;h=7e9917b589c7021a0c5852695e90eecb5fa36908;hb=71d10208f91a566b40ea1bdbb1e2f20f85f8182f;hp=260659e6847efbe8466c7e3c4ab997ebfe48d477;hpb=95af563cb577e8eedc95c0664a6529d12ea050ed;p=command.git diff --git a/include/option.h b/include/option.h index 260659e..7e9917b 100644 --- a/include/option.h +++ b/include/option.h @@ -8,6 +8,7 @@ #include "parameter.h" #include "exception/missingOptionValue.h" #include "exception/optionFailedConversion.h" +#include "exception/optionValueNotSpecified.h" namespace command { /** @@ -88,20 +89,19 @@ namespace command { * to ParameterType */ virtual bool understand(const std::string & argv) { - - if (argv.find(name) == 0) { - std::size_t pos = argv.find("="); + if (this->hasName(argv)) { + std::size_t pos = this->valuePosition(argv); if (pos != name.size()) { throw MissingOptionValue("Option: " + name + " requires value but no one has been provided"); } std::stringstream ss; - ss << argv.substr(pos + 1); + ss << std::fixed << argv.substr(pos + 1); ss >> value; if (ss.fail()) { - throw OptionFailedConversion("Value for option: " + name + " failed conversion to the required type"); + throw OptionFailedConversion("Option: " + name + " failed value conversion to the required type"); } return true; @@ -112,8 +112,19 @@ namespace command { /** * \inheritdoc */ - virtual unsigned int valuePosition(const std::string & argv) { - return argv.find("="); + virtual unsigned int valuePosition(const std::string & value) { + std::size_t pos = value.find("="); + + if ((this->hasName(value)) && (pos == std::string::npos)) { + throw OptionValueNotSpecified("Option: " + name + " requires value to be specified after equal sign, but no equal sign was found"); + } + + return pos; + } + + protected: + bool hasName(const std::string & argv) { + return argv.find(name) == 0; } }; @@ -185,7 +196,7 @@ namespace command { * \inheritdoc */ virtual unsigned int valuePosition(const std::string & ) { - throw new std::invalid_argument(this->describe() + "is void Option, so it does not have value part"); + throw new std::invalid_argument(this->describe() + " is void Option, so it does not have value part"); } }; }