10#include <nlohmann/json.hpp>
19 template <
class F,
typename T>
21 const std::string_view& input,
22 std::map<std::string_view, T>& mapping,
27 throw std::logic_error(
"Cannot convert empty unit string");
30 auto unit_begin = input.end();
31 while (unit_begin > input.begin() && std::isalpha(*(unit_begin - 1)))
36 auto unit = std::string(unit_begin, input.end());
37 ccf::nonstd::to_lower(unit);
38 auto value = std::string(input.begin(), unit_begin);
42 std::from_chars(value.data(), value.data() + value.size(), ret);
43 if (res.ec != std::errc())
45 throw std::logic_error(fmt::format(
46 "Could not convert value from size string \"{}\": {}",
56 auto factor = mapping.find(unit);
57 if (factor == mapping.end())
60 std::string allowed_units_str;
61 for (
auto it = mapping.begin(); it != mapping.end(); ++it)
63 allowed_units_str += it->first;
64 if (std::next(it) != mapping.end())
66 allowed_units_str +=
", ";
69 throw std::logic_error(fmt::format(
70 "Unit {} is invalid. Allowed: {}", unit, allowed_units_str));
73 return f(ret, factor->second);
77 static size_t convert_size_string(
const std::string_view& input)
79 std::map<std::string_view, size_t> size_suffix_to_power = {
80 {
"b", 0}, {
"kb", 1}, {
"mb", 2}, {
"gb", 3}, {
"tb", 4}, {
"pb", 5}};
83 input, size_suffix_to_power, [](
size_t value,
size_t power) {
84 return value * std::pow(1024, power);
88 static size_t convert_time_string(
const std::string_view& input)
90 std::map<std::string_view, std::pair<size_t, size_t>> size_suffix_to_power =
100 size_suffix_to_power,
101 [](
size_t value,
const std::pair<size_t, size_t>& factors) {
102 return value * factors.first * std::pow(10, factors.second);
128 value(convert_size_string(str_))
133 value(convert_size_string(str_))
136 inline operator size_t()
const
144 s = j.get<std::string_view>();
154 schema[
"type"] =
"string";
155 schema[
"pattern"] =
"^[0-9]+(B|KB|MB|GB|TB|PB)?$";
165 value(convert_time_string(str_))
168 inline operator std::chrono::microseconds()
const
173 inline operator std::chrono::milliseconds()
const
175 return std::chrono::duration_cast<std::chrono::milliseconds>(
176 std::chrono::microseconds(*
this));
179 inline operator std::chrono::seconds()
const
181 return std::chrono::duration_cast<std::chrono::seconds>(
182 std::chrono::microseconds(*
this));
187 return std::chrono::milliseconds(*this).count();
192 return std::chrono::seconds(*this).count();
198 s = j.get<std::string_view>();
208 schema[
"type"] =
"string";
209 schema[
"pattern"] =
"^[0-9]+(us|ms|s|min|h)?$";
215struct formatter<
ccf::ds::SizeString>
217 template <
typename ParseContext>
218 constexpr auto parse(ParseContext& ctx)
223 template <
typename FormatContext>
226 std::stringstream ss;
228 return format_to(ctx.out(),
"{}", ss.str());
Definition unit_strings.h:17
static size_t convert(const std::string_view &input, std::map< std::string_view, T > &mapping, F &&f)
Definition unit_strings.h:20
Definition contiguous_set.h:12
std::string schema_name(const SizeString *)
Definition unit_strings.h:147
void from_json(const nlohmann::json &j, SizeString &s)
Definition unit_strings.h:142
void to_json(nlohmann::json &j, const UnitString &s)
Definition unit_strings.h:116
void fill_json_schema(nlohmann::json &schema, const SizeString *)
Definition unit_strings.h:152
Definition app_interface.h:14
Definition unit_strings.h:122
size_t value
Definition unit_strings.h:123
SizeString(const char *str_)
Definition unit_strings.h:131
SizeString(const std::string_view &str_)
Definition unit_strings.h:126
Definition unit_strings.h:159
size_t count_s() const
Definition unit_strings.h:190
std::chrono::microseconds value
Definition unit_strings.h:160
TimeString(const std::string_view &str_)
Definition unit_strings.h:163
size_t count_ms() const
Definition unit_strings.h:185
Definition unit_strings.h:107
UnitString(const std::string_view &str_)
Definition unit_strings.h:111
bool operator==(const UnitString &) const =default
std::string str
Definition unit_strings.h:108