Commit f4ca710a authored by Paul Asmuth's avatar Paul Asmuth
Browse files

flagparser stub

parent fca05f57
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -48,7 +48,8 @@ set(FNORDMETRIC_QUERY_SOURCES

set(FNORDMETRIC_CLI_SOURCES
    ${FNORDMETRIC_QUERY_SOURCES}
    stage/src/fnordmetric/cli/cli.cc)
    stage/src/fnordmetric/cli/cli.cc
    stage/src/fnordmetric/cli/flagparser.cc)

include_directories(stage/src)
set(CMAKE_CXX_FLAGS "-std=c++0x -stdlib=libc++")
+4 −1
Original line number Diff line number Diff line
@@ -7,6 +7,7 @@
#include <vector>
#include <string>
#include <fnordmetric/cli/cli.h>
#include <fnordmetric/cli/flagparser.h>
#include <fnordmetric/util/inputstream.h>
#include <fnordmetric/util/outputstream.h>
#include <fnordmetric/util/runtimeexception.h>
@@ -14,9 +15,11 @@
namespace fnordmetric {
namespace cli {

void CLI::execute(std::vector<std::string> args) {
void CLI::execute(const cli::FlagParser& flag_parser) {
  std::unique_ptr<util::InputStream> input;

  const auto& args = flag_parser.getArgv();

  switch (args.size()) {
    case 0:
      input = std::move(util::InputStream::getStdin());
+2 −1
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@

namespace fnordmetric {
namespace cli {
class FlagParser;

class CLI {
public:
@@ -22,7 +23,7 @@ public:
   *
   * May throw an exception!
   */
  static void execute(std::vector<std::string> args);
  static void execute(const cli::FlagParser& flag_parser);
}
;

+23 −1
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
#include <string.h>
#include <fnordmetric/util/unittest.h>
#include <fnordmetric/cli/cli.h>
#include <fnordmetric/cli/flagparser.h>

using namespace fnordmetric::cli;

@@ -22,7 +23,28 @@ static fnordmetric::util::UnitTest::TestCase __test_simple_sql_to_svg_(
    "-o", "build/test/tmp/CLITest_TestSimpleSQLToSVG_out.svg.html"
  };

  CLI::execute(args);
  FlagParser flag_parser;

  flag_parser.defineFlag(
      FlagParser::T_STRING,
      false,
      "f",
      "format",
      "human",
      "The output format (svg,csv,human)",
      "<output_format>");

  flag_parser.defineFlag(
      FlagParser::T_STRING,
      false,
      "o",
      "output",
      NULL,
      "The output format (svg,csv,human)",
      "<output_format>");

  flag_parser.parseArgv(args);
  CLI::execute(flag_parser);

  EXPECT_FILES_EQ(
    "test/fixtures/CLITest_TestSimpleSQLToSVG_out.svg.html",

src/cli/flagparser.cc

0 → 100644
+88 −0
Original line number Diff line number Diff line
#include <string>
#include <vector>
#include <fnordmetric/cli/flagparser.h>
#include <fnordmetric/util/runtimeexception.h>

namespace fnordmetric {
namespace cli {

FlagParser::FlagParser() {}

void FlagParser::defineFlag(
    kFlagType type,
    bool required,
    const char* shortopt,
    const char* longopt /* = NULL */,
    const char* default_value /* = NULL */,
    const char* description /* = NULL */,
    const char* placeholder /* = NULL */) {

  FlagState flag_state;
  flag_state.type = type;
  flag_state.required = required;
  flag_state.shortopt = shortopt;
  flag_state.longopt = longopt;
  flag_state.default_value = default_value;
  flag_state.description = description;
  flag_state.placeholder = placeholder;
  flags_.emplace_back(flag_state);
}

// FIXPAUL optimize with hashmap?
void FlagParser::parseArgv(const std::vector<std::string>& argv) {
  for (int i = 0; i < argv.size(); i++) {
    auto& arg = argv[i];

    if (arg.size() == 0) {
      continue;
    }

    int eq_len = -1;
    FlagState* flag_ptr = nullptr;

    for (auto& flag : flags_) {
      auto shortopt = std::string("-") + flag.shortopt;
      auto shortopt_eq = std::string("-") + flag.shortopt + "=";

      if (arg.compare(0, shortopt.size(), shortopt)) {
        flag_ptr = &flag;
      }

      else if (arg.compare(0, shortopt_eq.size(), shortopt_eq)) {
        flag_ptr = &flag;
        eq_len = shortopt_eq.size();
      }

      else if (flag.longopt != nullptr) {
        auto longopt = std::string("--") + flag.longopt;
        auto longopt_eq = std::string("--") + flag.longopt + "=";

        if (arg.compare(0, longopt.size(), longopt)) {
          flag_ptr = &flag;
        }

        else if (arg.compare(0, longopt_eq.size(), longopt_eq)) {
          flag_ptr = &flag;
          eq_len = longopt_eq.size();
        }
      }

      if (flag_ptr != nullptr) {
        break;
      }
    }

    if (flag_ptr == nullptr) {
      argv_.push_back(arg);
    } else {

    }
  }
}

const std::vector<std::string>& FlagParser::getArgv() const {
  return argv_;
}

}
}
Loading