Make throw_* funcs and make validate() clearer

This commit is contained in:
Yoshihiro Hokazono 2022-06-21 07:14:09 +09:00
parent 12fcae66a7
commit 3459eec647

View File

@ -553,46 +553,19 @@ public:
if (mIsOptional) { if (mIsOptional) {
if (mIsUsed && !mNumArgsRange.contains(mValues.size()) && !mIsRepeatable && if (mIsUsed && !mNumArgsRange.contains(mValues.size()) && !mIsRepeatable &&
!mDefaultValue.has_value()) { !mDefaultValue.has_value()) {
std::stringstream stream; throw_nargs_range_validation_error();
stream << mUsedName << ": expected ";
if (mNumArgsRange.is_exact()) {
stream << mNumArgsRange.get_min();
} else if (mNumArgsRange.is_right_bounded()) {
stream << mNumArgsRange.get_min() << " to " << mNumArgsRange.get_max();
} else {
stream << mNumArgsRange.get_min() << " or more";
}
stream << " argument(s). "
<< mValues.size() << " provided.";
throw std::runtime_error(stream.str());
} else { } else {
// TODO: check if an implicit value was programmed for this argument // TODO: check if an implicit value was programmed for this argument
if (!mIsUsed && !mDefaultValue.has_value() && mIsRequired) { if (!mIsUsed && !mDefaultValue.has_value() && mIsRequired) {
std::stringstream stream; throw_required_arg_not_used_error();
stream << mNames[0] << ": required.";
throw std::runtime_error(stream.str());
} }
if (mIsUsed && mIsRequired && mValues.size() == 0) { if (mIsUsed && mIsRequired && mValues.size() == 0) {
std::stringstream stream; throw_required_arg_no_value_provided_error();
stream << mUsedName << ": no value provided.";
throw std::runtime_error(stream.str());
} }
} }
} else { } else {
if (!mNumArgsRange.contains(mValues.size()) && !mDefaultValue.has_value()) { if (!mNumArgsRange.contains(mValues.size()) && !mDefaultValue.has_value()) {
std::stringstream stream; throw_nargs_range_validation_error();
if (!mUsedName.empty())
stream << mUsedName << ": ";
if (mNumArgsRange.is_exact()) {
stream << mNumArgsRange.get_min();
} else if (mNumArgsRange.is_right_bounded()) {
stream << mNumArgsRange.get_min() << " to " << mNumArgsRange.get_max();
} else {
stream << mNumArgsRange.get_min() << " or more";
}
stream << " argument(s) expected. " << mValues.size()
<< " provided.";
throw std::runtime_error(stream.str());
} }
} }
} }
@ -646,6 +619,35 @@ public:
} }
private: private:
void throw_nargs_range_validation_error() const {
std::stringstream stream;
if (!mUsedName.empty())
stream << mUsedName << ": ";
if (mNumArgsRange.is_exact()) {
stream << mNumArgsRange.get_min();
} else if (mNumArgsRange.is_right_bounded()) {
stream << mNumArgsRange.get_min() << " to " << mNumArgsRange.get_max();
} else {
stream << mNumArgsRange.get_min() << " or more";
}
stream << " argument(s) expected. "
<< mValues.size() << " provided.";
throw std::runtime_error(stream.str());
}
void throw_required_arg_not_used_error() const {
std::stringstream stream;
stream << mNames[0] << ": required.";
throw std::runtime_error(stream.str());
}
void throw_required_arg_no_value_provided_error() const {
std::stringstream stream;
stream << mUsedName << ": no value provided.";
throw std::runtime_error(stream.str());
}
static constexpr int eof = std::char_traits<char>::eof(); static constexpr int eof = std::char_traits<char>::eof();
static auto lookahead(std::string_view s) -> int { static auto lookahead(std::string_view s) -> int {