1#ifndef MAZE_STATE_UTILS_H
2#define MAZE_STATE_UTILS_H
15namespace mazes::maze_state_utils
17 inline void parse_dimensions(
const std::optional<args> &args,
unsigned int &rows,
unsigned int &cols,
18 unsigned int &levels)
noexcept
20 if (
const auto parsed = args ? args->get() : std::nullopt; parsed.has_value())
22 if (
const auto it = parsed->find(mazes::args::ROW_WORD_STR); it != parsed->cend())
26 rows =
static_cast<unsigned int>(std::stoul(it->second));
32 if (
const auto it = parsed->find(mazes::args::COLUMN_WORD_STR); it != parsed->cend())
36 cols =
static_cast<unsigned int>(std::stoul(it->second));
42 if (
const auto it = parsed->find(mazes::args::LEVEL_WORD_STR); it != parsed->cend())
46 levels =
static_cast<unsigned int>(std::stoul(it->second));
55 inline bool has_distances(
const std::optional<args> &args)
noexcept
57 if (
const auto parsed = args ? args->get() : std::nullopt; parsed.has_value())
59 return parsed->find(mazes::args::DISTANCES_WORD_STR) != parsed->cend();
67 int start{configurator::DEFAULT_DISTANCES_START};
68 int end{configurator::DEFAULT_DISTANCES_END};
75 if (
const auto parsed =
args ?
args->
get() : std::nullopt; parsed.has_value())
77 settings.enabled = parsed->find(mazes::args::DISTANCES_WORD_STR) != parsed->cend();
79 if (
const auto it = parsed->find(mazes::args::DISTANCES_START_STR); it != parsed->cend())
83 settings.start = std::stoi(it->second);
89 if (
const auto it = parsed->find(mazes::args::DISTANCES_END_STR); it != parsed->cend())
93 settings.end = std::stoi(it->second);
104 inline state::ID output_state_for(
const std::optional<args> &args)
noexcept
106 if (
const auto parsed = args ? args->get() : std::nullopt; parsed.has_value())
108 if (
const auto it = parsed->find(mazes::args::OUTPUT_ID_WORD_STR); it != parsed->cend())
110 const std::string output = it->second;
111 if (output.empty() || output == STDOUT_FORMAT_STR)
113 return state::ID::STRINGIFYING;
116 const auto ext = std::filesystem::path{output}.extension().string();
119 return state::ID::STRINGIFYING;
122 auto normalized = ext;
123 if (!normalized.empty() && normalized.front() ==
'.')
125 normalized.erase(normalized.begin());
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;
147 if (normalized ==
"png" || normalized ==
"jpg" || normalized ==
"jpeg" || normalized ==
"bmp")
149 return state::ID::PIXELIZING;
154 return state::ID::STRINGIFYING;
157 inline randomizer *get_rng_or_default(
const runtime_app::context &ctx, randomizer &fallback_rng)
noexcept
159 if (
auto *rng = ctx.get_rng())
164 return &fallback_rng;
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.
Definition maze_state_utils.h:65