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 const 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 operator size_t()
const
149 s = j.get<std::string_view>();
153 [[maybe_unused]]
const SizeString* size_string_type)
159 nlohmann::json& schema, [[maybe_unused]]
const SizeString* size_string_type)
161 schema[
"type"] =
"string";
162 schema[
"pattern"] =
"^[0-9]+(B|KB|MB|GB|TB|PB)?$";
167 std::chrono::microseconds
value = {};
172 value(convert_time_string(str_))
175 operator std::chrono::microseconds()
const
180 operator std::chrono::milliseconds()
const
182 return std::chrono::duration_cast<std::chrono::milliseconds>(
183 std::chrono::microseconds(*
this));
186 operator std::chrono::seconds()
const
188 return std::chrono::duration_cast<std::chrono::seconds>(
189 std::chrono::microseconds(*
this));
194 return std::chrono::milliseconds(*this).count();
199 return std::chrono::seconds(*this).count();
205 s = j.get<std::string_view>();
209 [[maybe_unused]]
const TimeString* time_string_type)
215 nlohmann::json& schema, [[maybe_unused]]
const TimeString* time_string_type)
217 schema[
"type"] =
"string";
218 schema[
"pattern"] =
"^[0-9]+(us|ms|s|min|h)?$";
224struct formatter<
ccf::ds::SizeString>
226 template <
typename ParseContext>
227 constexpr auto parse(ParseContext& ctx)
232 template <
typename FormatContext>
235 std::stringstream ss;
237 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
void fill_json_schema(nlohmann::json &schema, const SizeString *size_string_type)
Definition unit_strings.h:158
std::string schema_name(const SizeString *size_string_type)
Definition unit_strings.h:152
void from_json(const nlohmann::json &j, SizeString &s)
Definition unit_strings.h:147
void to_json(nlohmann::json &j, const UnitString &s)
Definition unit_strings.h:116
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
size_t count_bytes() const
Definition unit_strings.h:141
Definition unit_strings.h:166
size_t count_s() const
Definition unit_strings.h:197
std::chrono::microseconds value
Definition unit_strings.h:167
TimeString(const std::string_view &str_)
Definition unit_strings.h:170
size_t count_ms() const
Definition unit_strings.h:192
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