Maze Builder Docs 8.2.1
Loading...
Searching...
No Matches
maze_state_utils.h
1#ifndef MAZE_STATE_UTILS_H
2#define MAZE_STATE_UTILS_H
3
4#include <MazeBuilder/args.h>
9#include <MazeBuilder/state.h>
10
11#include <filesystem>
12#include <optional>
13#include <string>
14
15namespace mazes::maze_state_utils
16{
17 inline void parse_dimensions(const std::optional<args> &args, unsigned int &rows, unsigned int &cols,
18 unsigned int &levels) noexcept
19 {
20 if (const auto parsed = args ? args->get() : std::nullopt; parsed.has_value())
21 {
22 if (const auto it = parsed->find(mazes::args::ROW_WORD_STR); it != parsed->cend())
23 {
24 try
25 {
26 rows = static_cast<unsigned int>(std::stoul(it->second));
27 }
28 catch (...)
29 {
30 }
31 }
32 if (const auto it = parsed->find(mazes::args::COLUMN_WORD_STR); it != parsed->cend())
33 {
34 try
35 {
36 cols = static_cast<unsigned int>(std::stoul(it->second));
37 }
38 catch (...)
39 {
40 }
41 }
42 if (const auto it = parsed->find(mazes::args::LEVEL_WORD_STR); it != parsed->cend())
43 {
44 try
45 {
46 levels = static_cast<unsigned int>(std::stoul(it->second));
47 }
48 catch (...)
49 {
50 }
51 }
52 }
53 }
54
55 inline bool has_distances(const std::optional<args> &args) noexcept
56 {
57 if (const auto parsed = args ? args->get() : std::nullopt; parsed.has_value())
58 {
59 return parsed->find(mazes::args::DISTANCES_WORD_STR) != parsed->cend();
60 }
61 return false;
62 }
63
64 struct distance_settings final
65 {
66 bool enabled{false};
67 int start{configurator::DEFAULT_DISTANCES_START};
68 int end{configurator::DEFAULT_DISTANCES_END};
69 };
70
71 inline distance_settings parse_distance_settings(const std::optional<args> &args) noexcept
72 {
73 distance_settings settings{};
74
75 if (const auto parsed = args ? args->get() : std::nullopt; parsed.has_value())
76 {
77 settings.enabled = parsed->find(mazes::args::DISTANCES_WORD_STR) != parsed->cend();
78
79 if (const auto it = parsed->find(mazes::args::DISTANCES_START_STR); it != parsed->cend())
80 {
81 try
82 {
83 settings.start = std::stoi(it->second);
84 }
85 catch (...)
86 {
87 }
88 }
89 if (const auto it = parsed->find(mazes::args::DISTANCES_END_STR); it != parsed->cend())
90 {
91 try
92 {
93 settings.end = std::stoi(it->second);
94 }
95 catch (...)
96 {
97 }
98 }
99 }
100
101 return settings;
102 }
103
104 inline state::ID output_state_for(const std::optional<args> &args) noexcept
105 {
106 if (const auto parsed = args ? args->get() : std::nullopt; parsed.has_value())
107 {
108 if (const auto it = parsed->find(mazes::args::OUTPUT_ID_WORD_STR); it != parsed->cend())
109 {
110 const std::string output = it->second;
111 if (output.empty() || output == STDOUT_FORMAT_STR)
112 {
113 return state::ID::STRINGIFYING;
114 }
115
116 const auto ext = std::filesystem::path{output}.extension().string();
117 if (ext.empty())
118 {
119 return state::ID::STRINGIFYING;
120 }
121
122 auto normalized = ext;
123 if (!normalized.empty() && normalized.front() == '.')
124 {
125 normalized.erase(normalized.begin());
126 }
127
128 try
129 {
130 switch (to_output_format_from_sv(normalized))
131 {
132 case output_format::PLAIN_TEXT:
133 case output_format::STDOUT:
134 return state::ID::STRINGIFYING;
135 case output_format::JSON_FILE:
136 return state::ID::PARSING;
137 case output_format::WAVEFRONT_OBJECT_FILE:
138 return state::ID::WAVEFRONT_OBJECTIFYING;
139 default:
140 break;
141 }
142 }
143 catch (...)
144 {
145 }
146
147 if (normalized == "png" || normalized == "jpg" || normalized == "jpeg" || normalized == "bmp")
148 {
149 return state::ID::PIXELIZING;
150 }
151 }
152 }
153
154 return state::ID::STRINGIFYING;
155 }
156
157 inline randomizer *get_rng_or_default(const runtime_app::context &ctx, randomizer &fallback_rng) noexcept
158 {
159 if (auto *rng = ctx.get_rng())
160 {
161 return rng;
162 }
163
164 return &fallback_rng;
165 }
166} // namespace mazes::maze_state_utils
167
168#endif // MAZE_STATE_UTILS_H
Command-line argument handler with JSON support.
Definition args.h:19
std::optional< std::string > get(const std::string &key) const noexcept
Get a value.
output_format to_output_format_from_sv(const std::string_view sv)
Convert a string to an output_format enum.
Definition output_formats.h:50
Definition maze_state_utils.h:65