Преглед изворни кода

Add help message, a simple prompt, and fixing a bug.

Sam Jaffe пре 5 година
родитељ
комит
aa1d339528
3 измењених фајлова са 28 додато и 4 уклоњено
  1. 9 1
      include/cli/cli.h
  2. 1 1
      include/cli/prompt.h
  3. 18 2
      src/cli.cxx

+ 9 - 1
include/cli/cli.h

@@ -26,10 +26,13 @@ public:
 
 private:
   std::istream &in_;
+  std::string prompt_;
+  std::unordered_map<std::string, size_t> arguments_;
   std::unordered_map<std::string, callback> callbacks_;
   bool eof_;
 
 public:
+  cli(std::string const & prompt, std::istream &in = std::cin);
   cli(std::istream &in = std::cin);
   template <typename... Args>
   cli & register_callback(std::string const & handle,
@@ -38,14 +41,18 @@ public:
   cli & register_callback(std::string const & handle, F && cb) {
     return register_callback(handle, lambdas::FFL(cb));
   }
+  
   void run() const;
-  template <typename T> static T from_string(std::string const &);
   template <typename T, size_t I>
   static auto from_string(std::string const & value) {
     using E = std::tuple_element_t<I, T>;
     using V = std::remove_cv_t<std::remove_reference_t<E>>;
     return from_string<V>(value);
   }
+  
+private:
+  bool active() const;
+  template <typename T> static T from_string(std::string const &);
 };
 
 template <typename... Args, size_t... Is>
@@ -58,6 +65,7 @@ void cli_invoke(std::function<void(Args...)> cb, cli::args_t const & args,
 template <typename... Args>
 cli & cli::register_callback(std::string const & handle,
                              std::function<void(Args...)> cb) {
+  arguments_.emplace(handle, sizeof...(Args));
   callbacks_.emplace(handle, [=](args_t const & args) {
     if (sizeof...(Args) > args.size()) {
       std::cerr << "Missing Args in command '" << handle << "', " <<

+ 1 - 1
include/cli/prompt.h

@@ -30,7 +30,7 @@ public:
     while (true) {
       input_prompt_->print(std::cout);
       std::string data;
-      if (!std::getline(in, data) || data.empty()) {
+      if (!std::getline(in, data)) {
         break;
       }
       std::stringstream ss{data};

+ 18 - 2
src/cli.cxx

@@ -12,13 +12,29 @@
 
 namespace cli {
 
-cli::cli(std::istream &in) : in_(in), callbacks_(), eof_(false) {
+cli::cli(std::string const & prompt, std::istream &in)
+    : in_(in), prompt_(prompt), eof_(false) {
   register_callback("quit", [this] { eof_ = true; });
+  register_callback("help", [this] {
+    for (auto & [k, v] : arguments_) {
+      std::cout << k;
+      for (size_t i = 0; i < v; ++i) {
+        std::cout << " arg" << i;
+      }
+      std::cout << "\n";
+    }
+  });
+}
+
+cli::cli(std::istream &in) : cli("cli::cli :> ", in) {}
+
+bool cli::active() const {
+  return !eof_ && (std::cout << prompt_).good();
 }
 
 void cli::run() const {
   std::string command;
-  while (!eof_ && std::getline(in_, command)) {
+  while (active() && std::getline(in_, command)) {
     auto views = string_utils::split(command, " ");
     command = views.front();
     views.erase(views.begin());