From f1247cd01093f90dd57f581a4b0d778bf82020cd Mon Sep 17 00:00:00 2001 From: Evgeniy Alekseev Date: Sun, 9 Dec 2018 19:04:48 +0300 Subject: [PATCH] add onSuccess and recover methods --- README.md | 19 +++++++++++++++++++ result.hpp | 41 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index fe48dbd..af6c6d8 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,25 @@ template Result::Content print_example(IResult r) } ``` +Construction like `r.match(...)` is also allowed. + +### `Result::recover`, `Result::onSuccess` + +`Result::recover` can be called in case if you want to set default value in case +of error or do another action. `Result::onSuccess` can be used to convert your +value to another one (including doing action if success): + +```cpp +auto convert = [](const int value) { return "str("s + std::to_string(value) + ")"s; }; + +std::string get_string(IResult r) +{ + return r + .onSuccess(convert) + .recover([](IError) { return ""s; }); +} +``` + ### DBus serialization example This code example is copied from [queued](http://github.com/arcan1s/queued) and diff --git a/result.hpp b/result.hpp index c9ada74..64c4d4e 100644 --- a/result.hpp +++ b/result.hpp @@ -190,6 +190,45 @@ public: break; } }; + /** + * @brief do action in case if no errors found + * @tparam U + * new value class name + * @tparam UnaryFunctionValue + * function type which will be cased if result contains value + * @param apply_value + * function which will be called if result contains value + * @return newly created result with another holded value type + */ + template + Result onSuccess(UnaryFunctionValue apply_value) const + { + Result result; + match([&result, &apply_value](T value) { result = apply_value(value); }, + [&result](Error error) { result = error; }); + + return result; + } + /** + * @brief recover to T in case of error + * @tparam UnaryFunctionError + * function type which will be cased if result contains error + * @param apply_error + * function which will be cased if result contains error + * @return value in case of Result::Content::Value, function call result + * otherwise + */ + template + T recover(UnaryFunctionError apply_error) const + { + T val; + match([&val](T value) { val = value; }, + [&val, &apply_error](Error error) { + val = apply_error(error); + }); + + return val; + } }; // additional functions @@ -217,6 +256,6 @@ void match(const Result &result, UnaryFunctionValue apply_value, { return result.match(apply_value, apply_error); }; -}; +}; // namespace Result #endif /* _RESULT_HPP_ */