prompt.h 906 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. //
  2. // prompt.h
  3. // cli
  4. //
  5. // Created by Sam Jaffe on 10/10/20.
  6. // Copyright © 2020 Sam Jaffe. All rights reserved.
  7. //
  8. #pragma once
  9. #include <iostream>
  10. #include <memory>
  11. #include <sstream>
  12. #include "message.h"
  13. namespace cli {
  14. class prompt {
  15. private:
  16. std::shared_ptr<struct message> input_prompt_;
  17. public:
  18. template <typename ...Args>
  19. prompt(Args &&...args)
  20. : input_prompt_(make_message(std::forward<Args>(args)...)) {}
  21. template <typename T> T read(std::istream & in = std::cin) const {
  22. T rval{};
  23. read(rval, in);
  24. return rval;
  25. }
  26. template <typename T> T & read(T & out, std::istream & in = std::cin) const {
  27. while (true) {
  28. input_prompt_->print(std::cout);
  29. std::string data;
  30. if (!std::getline(in, data)) {
  31. break;
  32. }
  33. std::stringstream ss{data};
  34. if (ss >> out) {
  35. break;
  36. }
  37. };
  38. return out;
  39. }
  40. };
  41. }