#pragma once #include #include class Error { public: std::string message; Error(std::string _message) : message(_message){}; }; class Void {}; template using Result = std::variant; template bool is_err(Result r) { return std::holds_alternative(r); } template bool is_ok(Result r) { return std::holds_alternative(r); } template R Ok(Result r) { return std::get(r); } /// enables rewrapping errors in a new Result type template Error Err(Result r) { return std::get(r); } template std::string err_msg(Result r) { return std::get(r).message; }