add new method to CmdArgParser (#2244)

* add new method to CmdArgParser

* refactor: rename method
This commit is contained in:
Borys 2023-12-01 17:14:25 +02:00 committed by GitHub
parent 2381316866
commit a57c6dac1e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 31 additions and 6 deletions

View file

@ -34,6 +34,19 @@ CmdArgParser::CheckProxy::operator bool() const {
return true;
}
void CmdArgParser::ExptectTag(std::string_view tag) {
if (cur_i_ >= args_.size()) {
Report(OUT_OF_BOUNDS, cur_i_);
return;
}
auto idx = cur_i_++;
auto val = ToSV(args_[idx]);
if (!absl::EqualsIgnoreCase(val, tag)) {
Report(INVALID_NEXT, idx);
}
}
template <typename T> T CmdArgParser::Num(size_t idx) {
auto arg = SafeSV(idx);
T out;

View file

@ -14,12 +14,7 @@ namespace facade {
// Utility class for easily parsing command options from argument lists.
struct CmdArgParser {
enum ErrorType {
OUT_OF_BOUNDS,
SHORT_OPT_TAIL,
INVALID_INT,
INVALID_CASES,
};
enum ErrorType { OUT_OF_BOUNDS, SHORT_OPT_TAIL, INVALID_INT, INVALID_CASES, INVALID_NEXT };
struct CheckProxy {
explicit operator bool() const;
@ -93,6 +88,10 @@ struct CmdArgParser {
}
}
// check next value ignoring case and consume it
void ExptectTag(std::string_view tag);
// Consume next value
template <class... Cases> auto Switch(Cases&&... cases) {
if (cur_i_ >= args_.size())
Report(OUT_OF_BOUNDS, cur_i_);

View file

@ -83,6 +83,19 @@ TEST_F(CmdArgParserTest, Check) {
EXPECT_TRUE(parser.Check("TAG_2").ExpectTail(1));
}
TEST_F(CmdArgParserTest, NextStatement) {
auto parser = Make({"TAG", "tag_2", "tag_3"});
parser.ExptectTag("TAG");
EXPECT_FALSE(parser.Error());
parser.ExptectTag("TAG_2");
EXPECT_FALSE(parser.Error());
parser.ExptectTag("TAG_2");
EXPECT_TRUE(parser.Error());
}
TEST_F(CmdArgParserTest, CheckTailFail) {
auto parser = Make({"TAG", "11", "22", "TAG", "33"});