/* vim:set ts=2 sw=2 sts=2 et: */
/**
* \author Marcus Holland-Moritz (github@mhxnet.de)
* \copyright Copyright (c) Marcus Holland-Moritz
*
* This file is part of dwarfs.
*
* dwarfs is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* dwarfs is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with dwarfs. If not, see .
*/
#include
#include
#include
#if FMT_VERSION >= 110000
#include
#endif
#include
#include
#include
#include
namespace dwarfs {
option_map::option_map(const std::string_view spec) {
auto arg = split_to>(spec, ':');
choice_ = arg[0];
for (size_t i = 1; i < arg.size(); ++i) {
std::string key;
std::string val;
if (auto eqpos = arg[i].find('='); eqpos != std::string_view::npos) {
key.assign(arg[i].substr(0, eqpos));
val.assign(arg[i].substr(eqpos + 1));
} else {
key.assign(arg[i]);
val.assign("1");
}
if (!opt_.emplace(key, val).second) {
DWARFS_THROW(
runtime_error,
fmt::format("duplicate option {} for choice {}", key, choice_));
}
}
}
size_t option_map::get_size(const std::string& key, size_t default_value) {
auto i = opt_.find(key);
if (i != opt_.end()) {
std::string val = i->second;
opt_.erase(i);
return parse_size_with_unit(val);
}
return default_value;
}
void option_map::report() {
if (!opt_.empty()) {
std::vector invalid;
std::transform(opt_.begin(), opt_.end(), std::back_inserter(invalid),
[](const auto& p) { return p.first; });
std::sort(invalid.begin(), invalid.end());
DWARFS_THROW(runtime_error,
fmt::format("invalid option(s) for choice {}: {}", choice_,
fmt::join(invalid, ", ")));
}
}
} // namespace dwarfs