#pragma once #include #include #include #include #include #include #include #include #include namespace vamp_zero { template requires(!std::is_same_v) auto parse_integer(std::string_view text, std::string_view name) -> std::expected { auto invalid = [&](std::string_view reason) { return modulus::fail( make_error(error_code::INVALID_ARGUMENT, std::string{name} + " " + std::string{reason})); }; if (text.empty()) { return invalid("must be an integer"); } auto value = VALUE{}; auto end = text.data() + text.size(); auto parsed = std::from_chars(text.data(), end, value); if (parsed.ec == std::errc::result_out_of_range) { return invalid("is out of range"); } if (parsed.ec != std::errc{} || parsed.ptr != end) { return invalid("must be an integer"); } return modulus::success(value); } }