yaze 0.3.2
Link to the Past ROM Editor
 
Loading...
Searching...
No Matches
test_common.cc
Go to the documentation of this file.
2
3#include <cctype>
4#include <iostream>
5#include <string>
6
7#include "absl/strings/numbers.h"
8#include "absl/strings/str_cat.h"
9#include "absl/strings/str_split.h"
10#include "absl/strings/strip.h"
11
12#if defined(_WIN32)
13#include <io.h>
14#else
15#include <unistd.h>
16#endif
17
18namespace yaze {
19namespace cli {
20namespace agent {
21
22std::string TrimWhitespace(absl::string_view value) {
23 return std::string(absl::StripAsciiWhitespace(value));
24}
25
27#if defined(_WIN32)
28 return _isatty(_fileno(stdin)) != 0;
29#else
30 return isatty(fileno(stdin)) != 0;
31#endif
32}
33
34std::string PromptWithDefault(const std::string& prompt,
35 const std::string& default_value,
36 bool allow_empty) {
37 while (true) {
38 std::cout << prompt;
39 if (!default_value.empty()) {
40 std::cout << " [" << default_value << "]";
41 }
42 std::cout << ": ";
43 std::cout.flush();
44
45 std::string line;
46 if (!std::getline(std::cin, line)) {
47 return default_value;
48 }
49 std::string trimmed = TrimWhitespace(line);
50 if (!trimmed.empty()) {
51 return trimmed;
52 }
53 if (!default_value.empty()) {
54 return default_value;
55 }
56 if (allow_empty) {
57 return std::string();
58 }
59 std::cout << " Value is required." << std::endl;
60 }
61}
62
63std::string PromptRequired(const std::string& prompt,
64 const std::string& default_value) {
65 return PromptWithDefault(prompt, default_value, /*allow_empty=*/false);
66}
67
68int PromptInt(const std::string& prompt, int default_value, int min_value) {
69 while (true) {
70 std::string default_str = absl::StrCat(default_value);
71 std::string input = PromptWithDefault(prompt, default_str);
72 if (input.empty()) {
73 return default_value;
74 }
75 int value = 0;
76 if (absl::SimpleAtoi(input, &value) && value >= min_value) {
77 return value;
78 }
79 std::cout << " Enter an integer >= " << min_value << "." << std::endl;
80 }
81}
82
83bool PromptYesNo(const std::string& prompt, bool default_value) {
84 while (true) {
85 std::cout << prompt << " [" << (default_value ? "Y/n" : "y/N")
86 << "]: ";
87 std::cout.flush();
88 std::string line;
89 if (!std::getline(std::cin, line)) {
90 return default_value;
91 }
92 std::string trimmed = TrimWhitespace(line);
93 if (trimmed.empty()) {
94 return default_value;
95 }
96 char c = static_cast<char>(std::tolower(static_cast<unsigned char>(trimmed[0])));
97 if (c == 'y') {
98 return true;
99 }
100 if (c == 'n') {
101 return false;
102 }
103 std::cout << " Please respond with 'y' or 'n'." << std::endl;
104 }
105}
106
107std::vector<std::string> ParseCommaSeparated(absl::string_view input) {
108 std::vector<std::string> values;
109 for (absl::string_view token : absl::StrSplit(input, ',')) {
110 std::string trimmed = TrimWhitespace(token);
111 if (!trimmed.empty()) {
112 values.push_back(trimmed);
113 }
114 }
115 return values;
116}
117
118bool ParseKeyValueEntry(const std::string& input, std::string* key,
119 std::string* value) {
120 size_t equals = input.find('=');
121 if (equals == std::string::npos) {
122 return false;
123 }
124 *key = TrimWhitespace(absl::string_view(input.data(), equals));
125 *value = TrimWhitespace(absl::string_view(input.data() + equals + 1,
126 input.size() - equals - 1));
127 return !key->empty();
128}
129
130} // namespace agent
131} // namespace cli
132} // namespace yaze
133
bool ParseKeyValueEntry(const std::string &input, std::string *key, std::string *value)
std::string PromptWithDefault(const std::string &prompt, const std::string &default_value, bool allow_empty)
int PromptInt(const std::string &prompt, int default_value, int min_value)
std::string TrimWhitespace(absl::string_view value)
bool PromptYesNo(const std::string &prompt, bool default_value)
std::vector< std::string > ParseCommaSeparated(absl::string_view input)
bool IsInteractiveInput()
std::string PromptRequired(const std::string &prompt, const std::string &default_value)
Main namespace for the application.
bool equals(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, BinaryPredicate p)