Skip to content

Commit 4bbf7ec

Browse files
committed
feat(Config): paths relative to secondary options
1 parent 49849a5 commit 4bbf7ec

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

src/lib/Lib/Config.cpp

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -193,15 +193,34 @@ struct PublicSettingsVisitor {
193193
if (referenceDirKey == "config-dir") {
194194
return dirs.configDir;
195195
}
196-
else if (referenceDirKey == "cwd") {
196+
if (referenceDirKey == "cwd") {
197197
return dirs.cwd;
198198
}
199-
else if (referenceDirKey == "mrdocs-root") {
199+
if (referenceDirKey == "mrdocs-root") {
200200
return dirs.mrdocsRoot;
201201
}
202-
else if (referenceDirKey == "output") {
203-
MRDOCS_ASSERT(!settings.output.empty());
204-
return settings.output;
202+
if (!referenceDirKey.empty()) {
203+
Expected<std::string_view> res = Unexpected(formatError("unknown relative-to value: \"{}\"", referenceDirKey));
204+
settings.visit([&]<typename T>(std::string_view const name, T& value)
205+
{
206+
if constexpr (std::convertible_to<T, std::string_view>)
207+
{
208+
if (name != referenceDirKey)
209+
{
210+
return;
211+
}
212+
std::string_view valueSv(value);
213+
if (!value.empty())
214+
{
215+
res = value;
216+
return;
217+
}
218+
res = Unexpected(formatError(
219+
"relative-to value \"{}\" is empty",
220+
referenceDirKey));
221+
}
222+
});
223+
return res;
205224
}
206225
return Unexpected(formatError("unknown relative-to value: \"{}\"", referenceDirKey));
207226
}

util/generate-config-info.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,16 @@ def generate_public_settings_hpp(config):
361361
contents += f' std::forward<F>(f)({escape_as_cpp_string(option["name"])}, {to_camel_case(option["name"])});\n'
362362
contents += ' }\n\n'
363363

364+
contents += ' /** Visit all options\n'
365+
contents += ' */\n'
366+
contents += ' template <class F>\n'
367+
contents += ' void\n'
368+
contents += ' visit(F&& f) const\n'
369+
contents += ' {\n'
370+
for option in flat_options:
371+
contents += f' std::forward<F>(f)({escape_as_cpp_string(option["name"])}, {to_camel_case(option["name"])});\n'
372+
contents += ' }\n\n'
373+
364374
contents += '}; // struct PublicSettings\n\n'
365375

366376
# Functions to convert enums to strings

0 commit comments

Comments
 (0)