25ChainableResult<ConfigValue<T>> LazyLayeredConfig::resolve_config_value(
26 const std::string &cache_key, std::function<LayerValue<T>(
const ConfigProvider &)> provider_call)
const
38 if (cache_.contains(cache_key)) {
40 T cached_value = std::any_cast<T>(cache_.at(cache_key));
41 std::string source = source_.at(cache_key);
42 std::vector<std::string> source_details = source_details_.at(cache_key);
43 return ConfigValue<T>{cached_value, cache_key, source, source_details};
47 for (
const auto &provider : providers_) {
48 LayerValue<T> layer_value = provider_call(*provider);
52 const auto source_info = format_->
format(
"{}", layer_value.source_info);
53 std::vector<std::string> error_lines;
54 error_lines.push_back(format_->
format(
"{}: invalid: {}", source_info, layer_value.error_message));
56 if (!layer_value.source_details.empty()) {
57 error_lines.emplace_back(
"");
58 for (
const auto &detail : layer_value.source_details) {
59 error_lines.push_back(detail);
63 return FormattableError{error_lines};
68 T resolved_value = layer_value.value.value();
69 cache_[cache_key] = resolved_value;
70 cache_value_strings_[cache_key] =
to_string(resolved_value);
71 std::string source = format_->
format(
"{}", layer_value.source_info);
72 source_[cache_key] = source;
73 source_details_[cache_key] = layer_value.source_details;
74 return ConfigValue<T>{resolved_value, cache_key, source, layer_value.source_details};
81 panic(format_->
format(
"no value found for '{}' in any config layer", cache_key));
88 const auto base_name = name.substr(0, name.size() - 4);
89 const auto key = tileset +
":" + base_name;
90 return resolve_config_value<std::size_t>(
98 const auto base_name = name.substr(0, name.size() - 4);
99 const auto key = tileset +
":" + base_name;
100 return resolve_config_value<std::size_t>(
108 const auto base_name = name.substr(0, name.size() - 4);
109 const auto key = tileset +
":" + base_name;
110 return resolve_config_value<std::size_t>(
118 const auto base_name = name.substr(0, name.size() - 4);
119 const auto key = tileset +
":" + base_name;
120 return resolve_config_value<std::size_t>(
128 const auto base_name = name.substr(0, name.size() - 4);
129 const auto key = tileset +
":" + base_name;
130 return resolve_config_value<std::size_t>(
138 const auto base_name = name.substr(0, name.size() - 4);
139 const auto key = tileset +
":" + base_name;
140 return resolve_config_value<std::size_t>(
148 const auto base_name = name.substr(0, name.size() - 4);
149 const auto key = tileset +
":" + base_name;
150 return resolve_config_value<std::size_t>(
158 const auto base_name = name.substr(0, name.size() - 4);
159 const auto key = tileset +
":" + base_name;
160 return resolve_config_value<std::size_t>(
168 const auto base_name = name.substr(0, name.size() - 4);
169 const auto key = tileset +
":" + base_name;
170 return resolve_config_value<Rgba32>(
178 const auto base_name = name.substr(0, name.size() - 4);
179 const auto key = tileset +
":" + base_name;
180 return resolve_config_value<bool>(
188 const auto base_name = name.substr(0, name.size() - 4);
189 const auto key = tileset +
":" + base_name;
190 return resolve_config_value<TilesPalMode>(
196 if (cache_.empty()) {
197 return "LazyLayeredConfig {}";
200 std::string result =
"LazyLayeredConfig {\n";
201 for (
const auto &key : cache_ | std::views::keys) {
202 const auto provenance_it = source_.find(key);
203 const std::string provenance_info =
204 (provenance_it != source_.end()) ? provenance_it->second :
"<unknown source>";
206 const auto value_it = cache_value_strings_.find(key);
207 const std::string value_str = (value_it != cache_value_strings_.end()) ? value_it->second :
"<unknown value>";
209 result += format_->
format(
" {} = {} [{}]\n", key, value_str, provenance_info);
218 for (
const auto &tileset_name : tileset_names) {
A result type that maintains a chainable sequence of errors for debugging and error reporting.
An interface which config implementations can use to load config values.
virtual LayerValue< std::size_t > num_pals_primary(const std::string &tileset) const
virtual LayerValue< std::size_t > num_metatiles_primary(const std::string &tileset) const
virtual LayerValue< std::size_t > num_pals_total(const std::string &tileset) const
virtual LayerValue< std::size_t > num_tiles_primary(const std::string &tileset) const
virtual LayerValue< Rgba32 > extrinsic_transparency(const std::string &tileset) const
virtual LayerValue< bool > patch_build_enabled(const std::string &tileset) const
virtual LayerValue< std::size_t > num_tiles_total(const std::string &tileset) const
virtual LayerValue< std::size_t > max_map_data_size(const std::string &tileset) const
virtual LayerValue< TilesPalMode > tiles_pal_mode(const std::string &tileset) const
virtual LayerValue< std::size_t > num_tiles_per_metatile(const std::string &tileset) const
virtual LayerValue< std::size_t > num_metatiles_total(const std::string &tileset) const
ChainableResult< ConfigValue< std::size_t > > num_pals_primary(const std::string &tileset) const
ChainableResult< ConfigValue< std::size_t > > max_map_data_size(const std::string &tileset) const
ChainableResult< ConfigValue< std::size_t > > num_pals_total(const std::string &tileset) const
ChainableResult< ConfigValue< Rgba32 > > extrinsic_transparency(const std::string &tileset) const
ChainableResult< ConfigValue< std::size_t > > num_tiles_per_metatile(const std::string &tileset) const
ChainableResult< ConfigValue< std::size_t > > num_metatiles_total(const std::string &tileset) const
ChainableResult< ConfigValue< std::size_t > > num_tiles_primary(const std::string &tileset) const
ChainableResult< ConfigValue< std::size_t > > num_tiles_total(const std::string &tileset) const
ChainableResult< ConfigValue< std::size_t > > num_metatiles_primary(const std::string &tileset) const
ChainableResult< ConfigValue< bool > > patch_build_enabled(const std::string &tileset) const
ChainableResult< ConfigValue< TilesPalMode > > tiles_pal_mode(const std::string &tileset) const
ChainableResult< ConfigValue< std::size_t > > num_tiles_total_raw(const std::string &tileset) const override
ChainableResult< ConfigValue< Rgba32 > > extrinsic_transparency_raw(const std::string &tileset) const override
ChainableResult< ConfigValue< TilesPalMode > > tiles_pal_mode_raw(const std::string &tileset) const override
ChainableResult< ConfigValue< std::size_t > > num_tiles_per_metatile_raw(const std::string &tileset) const override
ChainableResult< ConfigValue< std::size_t > > num_metatiles_total_raw(const std::string &tileset) const override
ChainableResult< ConfigValue< bool > > patch_build_enabled_raw(const std::string &tileset) const override
ChainableResult< ConfigValue< std::size_t > > max_map_data_size_raw(const std::string &tileset) const override
ChainableResult< ConfigValue< std::size_t > > num_tiles_primary_raw(const std::string &tileset) const override
std::string dump() const
Dumps the current state of the config for debugging purposes.
ChainableResult< ConfigValue< std::size_t > > num_metatiles_primary_raw(const std::string &tileset) const override
ChainableResult< ConfigValue< std::size_t > > num_pals_primary_raw(const std::string &tileset) const override
void warmup_cache(const std::vector< std::string > &tileset_names) const
Forces all configuration values to be cached immediately for all known tilesets.
ChainableResult< ConfigValue< std::size_t > > num_pals_total_raw(const std::string &tileset) const override
virtual std::string format(const std::string &format_str, const std::vector< FormatParam > ¶ms) const
Formats a string with styled parameters using fmtlib syntax.
void panic(const StringViewSourceLoc &s)
Unconditionally terminates the program with a panic message.
std::string extract_function_name(const std::source_location &location=std::source_location::current())
Extracts the function name from a source location.
std::string to_string(const IncrementalBuildMode &value)