// // Created by mfritzsc on 7/12/17. // #ifndef TMCAGLWM_RESULT_HPP #define TMCAGLWM_RESULT_HPP #include #include namespace wm { using std::experimental::optional; using std::experimental::nullopt; // We only ever return a string as an error - so just parametrize // this over result type T template struct result { char const *e; optional t; bool is_ok() const { return this->t != nullopt; } bool is_err() const { return this->e != nullptr; } T unwrap() { if (this->e != nullptr) { throw std::logic_error(this->e); } return this->t.value(); } operator T() { return this->unwrap(); } char const *unwrap_err() { return this->e; } optional ok() const { return this->t; } optional err() const { return optional(this->e); } result map_err(std::function f); }; template struct result Err(char const *e) { return result{e, nullopt}; } template struct result Ok(T t) { return result{nullptr, t}; } template result result::map_err(std::function f) { if (this->is_err()) { return Err(f(this->e)); } return *this; } } // namespace wm #endif // TMCAGLWM_RESULT_HPP