refactor(editor): extract optional-arg parse helpers
Every --gen-texture-* and --gen-mesh-* handler had its own
copy of the same 3-line "if there's another arg AND it
doesn't look like a switch, parse it; otherwise keep the
default" block. 458 sites across cli_gen_texture.cpp and
cli_gen_mesh.cpp duplicated this pattern.
Hoist into cli_arg_parse.hpp as inline parseOpt{Int,Float,Uint}
(int& i, int argc, char** argv, T& value). Each call site
collapses from 3 lines to 1:
if (i + 1 < argc && argv[i + 1][0] != '-') {
try { width = std::stof(argv[++i]); } catch (...) {}
}
becomes
parseOptFloat(i, argc, argv, width);
cli_gen_mesh.cpp drops by ~250 lines, cli_gen_texture.cpp
by ~430 lines. Output bytes verified identical: firepit
default-arg surface area 2.1100 m² unchanged.
Future texture/mesh primitives now opt in by including one
header instead of pasting the lambda.
2026-05-09 11:42:55 -07:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <cstdint>
|
|
|
|
|
#include <cstring>
|
|
|
|
|
#include <string>
|
|
|
|
|
|
|
|
|
|
namespace wowee {
|
|
|
|
|
namespace editor {
|
|
|
|
|
namespace cli {
|
|
|
|
|
|
|
|
|
|
// Common pattern across cli_gen_texture and cli_gen_mesh handlers:
|
|
|
|
|
// "if there's another arg AND it doesn't look like a switch, parse
|
|
|
|
|
// it into <var>; otherwise leave <var> at its default". 465+ copies
|
|
|
|
|
// across the two files were each writing this 3-line block manually.
|
|
|
|
|
//
|
|
|
|
|
// Each helper silently no-ops on parse failure so the caller's
|
|
|
|
|
// default value is preserved — matches the prior try/catch
|
|
|
|
|
// behavior exactly.
|
|
|
|
|
|
|
|
|
|
inline bool parseOptArg(int& i, int argc, char** argv) {
|
|
|
|
|
return i + 1 < argc && argv[i + 1][0] != '-';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void parseOptInt(int& i, int argc, char** argv, int& value) {
|
|
|
|
|
if (parseOptArg(i, argc, argv)) {
|
|
|
|
|
try { value = std::stoi(argv[++i]); } catch (...) {}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void parseOptFloat(int& i, int argc, char** argv, float& value) {
|
|
|
|
|
if (parseOptArg(i, argc, argv)) {
|
|
|
|
|
try { value = std::stof(argv[++i]); } catch (...) {}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
inline void parseOptUint(int& i, int argc, char** argv, uint32_t& value) {
|
|
|
|
|
if (parseOptArg(i, argc, argv)) {
|
|
|
|
|
try { value = static_cast<uint32_t>(std::stoul(argv[++i])); }
|
|
|
|
|
catch (...) {}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-09 14:50:27 -07:00
|
|
|
// Common --json-output flag pattern: every --info-* / --validate-*
|
|
|
|
|
// handler (~50 sites across the editor) writes the same three lines
|
|
|
|
|
// to detect and consume an optional `--json` follower. Hoisted here
|
|
|
|
|
// so future handlers can do `bool jsonOut = consumeJsonFlag(i, argc, argv);`
|
|
|
|
|
// instead of the open-coded peek-and-advance.
|
|
|
|
|
inline bool consumeJsonFlag(int& i, int argc, char** argv) {
|
|
|
|
|
if (i + 1 < argc && std::strcmp(argv[i + 1], "--json") == 0) {
|
|
|
|
|
++i;
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
refactor(editor): extract optional-arg parse helpers
Every --gen-texture-* and --gen-mesh-* handler had its own
copy of the same 3-line "if there's another arg AND it
doesn't look like a switch, parse it; otherwise keep the
default" block. 458 sites across cli_gen_texture.cpp and
cli_gen_mesh.cpp duplicated this pattern.
Hoist into cli_arg_parse.hpp as inline parseOpt{Int,Float,Uint}
(int& i, int argc, char** argv, T& value). Each call site
collapses from 3 lines to 1:
if (i + 1 < argc && argv[i + 1][0] != '-') {
try { width = std::stof(argv[++i]); } catch (...) {}
}
becomes
parseOptFloat(i, argc, argv, width);
cli_gen_mesh.cpp drops by ~250 lines, cli_gen_texture.cpp
by ~430 lines. Output bytes verified identical: firepit
default-arg surface area 2.1100 m² unchanged.
Future texture/mesh primitives now opt in by including one
header instead of pasting the lambda.
2026-05-09 11:42:55 -07:00
|
|
|
} // namespace cli
|
|
|
|
|
} // namespace editor
|
|
|
|
|
} // namespace wowee
|