#include "suggestions.hh" #include "error.hh" namespace nix { // Either a value of type `T`, or some suggestions template class OrSuggestions { public: using Raw = std::variant; Raw raw; T* operator ->() { return &**this; } T& operator *() { if (auto elt = std::get_if(&raw)) return *elt; throw Error("Invalid access to a failed value"); } operator bool() const noexcept { return std::holds_alternative(raw); } OrSuggestions(T t) : raw(t) { } OrSuggestions() : raw(Suggestions{}) { } static OrSuggestions failed(const Suggestions & s) { auto res = OrSuggestions(); res.raw = s; return res; } static OrSuggestions failed() { return OrSuggestions::failed(Suggestions{}); } const Suggestions & getSuggestions() { static Suggestions noSuggestions; if (const auto & suggestions = std::get_if(&raw)) return *suggestions; else return noSuggestions; } }; }