diff --git a/modules/13_cpp23/src/expected.cpp b/modules/13_cpp23/src/expected.cpp index 5e54f85..2be011e 100644 --- a/modules/13_cpp23/src/expected.cpp +++ b/modules/13_cpp23/src/expected.cpp @@ -1,20 +1,34 @@ #include "expected.hpp" +#include + namespace cpp23 { auto parse_int(const std::string& text) -> std::expected { - (void)text; - return std::unexpected(ParseError::EmptyInput); + if (text.empty()) { + return std::unexpected(ParseError::EmptyInput); + } + try { + const auto i = std::stoi(text); + return i; + } + catch (const std::invalid_argument&) { + return std::unexpected(ParseError::InvalidNumber); + } + catch (const std::out_of_range&) { + return std::unexpected(ParseError::InvalidNumber); + } } -auto safe_sqrt(int value) -> std::expected { - (void)value; - return std::unexpected(std::string{"negative"}); +auto safe_sqrt(const int value) -> std::expected { + if (value < 0) { + return std::unexpected(std::string{"negative"}); + } + return std::sqrt(value); } auto chain_parse_and_double(const std::string& text) -> std::expected { - (void)text; - return std::unexpected(ParseError::InvalidNumber); + return parse_int(text).transform([](const auto i) { return i * 2; }); } } // namespace cpp23