From 89e2380da8d432a84ab93345d82389010172adcf Mon Sep 17 00:00:00 2001 From: Vaxry Date: Tue, 28 Apr 2026 15:48:11 +0100 Subject: desktop/rule: use Numeric for number parsing --- src/desktop/rule/layerRule/LayerRule.cpp | 36 ++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 9 deletions(-) (limited to 'src/desktop/rule/layerRule/LayerRule.cpp') diff --git a/src/desktop/rule/layerRule/LayerRule.cpp b/src/desktop/rule/layerRule/LayerRule.cpp index 10120d7f..ccff3960 100644 --- a/src/desktop/rule/layerRule/LayerRule.cpp +++ b/src/desktop/rule/layerRule/LayerRule.cpp @@ -5,26 +5,44 @@ #include #include +#include using namespace Desktop; using namespace Desktop::Rule; +using namespace Hyprutils::String; + +static const char* numericParseError(eNumericParseResult r) { + switch (r) { + case NUMERIC_PARSE_BAD: return "bad input"; + case NUMERIC_PARSE_GARBAGE: return "garbage input"; + case NUMERIC_PARSE_OUT_OF_RANGE: return "out of range"; + case NUMERIC_PARSE_OK: return "ok"; + default: return "error"; + } +} static std::expected parseInt(std::string_view effectName, const std::string& raw) { - try { - return std::stoll(raw); - } catch (std::exception& e) { return std::unexpected(std::format("{} rule \"{}\" failed with: {}", effectName, raw, e.what())); } + auto parsed = strToNumber(raw); + if (!parsed) + return std::unexpected(std::format("{} rule \"{}\" failed with: {}", effectName, raw, numericParseError(parsed.error()))); + + return *parsed; } static std::expected parseFloat(std::string_view effectName, const std::string& raw) { - try { - return std::stof(raw); - } catch (std::exception& e) { return std::unexpected(std::format("{} rule \"{}\" failed with: {}", effectName, raw, e.what())); } + auto parsed = strToNumber(raw); + if (!parsed) + return std::unexpected(std::format("{} rule \"{}\" failed with: {}", effectName, raw, numericParseError(parsed.error()))); + + return *parsed; } static std::expected parseAboveLock(const std::string& raw) { - try { - return sc(std::clamp(std::stoull(raw), 0ULL, 2ULL)); - } catch (std::exception& e) { return std::unexpected(std::format("above_lock rule \"{}\" failed with: {}", raw, e.what())); } + auto parsed = strToNumber(raw); + if (!parsed) + return std::unexpected(std::format("above_lock rule \"{}\" failed with: {}", raw, numericParseError(parsed.error()))); + + return std::clamp(*parsed, int64_t{0}, int64_t{2}); } static std::expected parseLayerRuleEffect(CLayerRuleEffectContainer::storageType e, const std::string& raw) { -- cgit v1.2.3