cli.h 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. //
  2. // cli.h
  3. // tax-manager
  4. //
  5. // Created by Sam Jaffe on 10/8/20.
  6. // Copyright © 2020 Sam Jaffe. All rights reserved.
  7. //
  8. #pragma once
  9. #include <functional>
  10. #include <iostream>
  11. #include <string>
  12. #include <tuple>
  13. #include <unordered_map>
  14. #include <vector>
  15. #include "lambda_cast.h"
  16. namespace cli {
  17. class cli {
  18. public:
  19. using args_t = std::vector<std::string>;
  20. using callback = std::function<void(args_t const &)>;
  21. private:
  22. std::istream &in_;
  23. std::unordered_map<std::string, callback> callbacks_;
  24. bool eof_;
  25. public:
  26. cli(std::istream &in = std::cin);
  27. template <typename... Args>
  28. cli & register_callback(std::string const & handle,
  29. std::function<void(Args...)> const & cb);
  30. template <typename F>
  31. cli & register_callback(std::string const & handle, F && cb) {
  32. return register_callback(handle, lambdas::FFL(cb));
  33. }
  34. void run() const;
  35. template <typename T> static T from_string(std::string const &);
  36. };
  37. template <typename... Args, size_t... Is>
  38. void cli_invoke(std::function<void(Args...)> cb, cli::args_t const & args,
  39. std::index_sequence<Is...>) {
  40. using tuple = std::tuple<Args...>;
  41. cb(cli::from_string<std::tuple_element<Is, tuple>>(args[Is])...);
  42. }
  43. template <typename... Args>
  44. cli & cli::register_callback(std::string const & handle,
  45. std::function<void(Args...)> const & cb) {
  46. callbacks_.emplace(handle, [cb](args_t const & args) {
  47. if (sizeof...(Args) > args.size()) return; // TODO: Error message
  48. cli_invoke(cb, args, std::make_index_sequence<sizeof...(Args)>());
  49. });
  50. return *this;
  51. }
  52. }