#ifndef error_hh #define error_hh #include "ansicolor.hh" #include #include #include #include "types.hh" namespace nix { typedef enum { lvlError = 0, lvlWarn, lvlInfo, lvlTalkative, lvlChatty, lvlDebug, lvlVomit } Verbosity; struct ErrPos { int line; int column; string file; template ErrPos& operator=(const P &pos) { line = pos.line; column = pos.column; file = pos.file; return *this; } template ErrPos(const P &p) { *this = p; } }; struct NixCode { ErrPos errPos; std::optional prevLineOfCode; string errLineOfCode; std::optional nextLineOfCode; }; // ---------------------------------------------------------------- // format function for hints. same as fmt, except templated values // are always in yellow. template struct yellowify { yellowify(T &s) : value(s) {} T &value; }; template std::ostream& operator<<(std::ostream &out, const yellowify &y) { return out << ANSI_YELLOW << y.value << ANSI_NORMAL; } class hintformat { public: hintformat(string format) :fmt(format) { fmt.exceptions(boost::io::all_error_bits ^ boost::io::too_many_args_bit); } template hintformat& operator%(const T &value) { fmt % yellowify(value); return *this; } std::string str() const { return fmt.str(); } template friend class AddHint; private: format fmt; }; std::ostream& operator<<(std::ostream &os, const hintformat &hf); template inline hintformat hintfmt(const std::string & fs, const Args & ... args) { hintformat f(fs); formatHelper(f, args...); return f; } // ------------------------------------------------- // ErrorInfo. struct ErrorInfo { Verbosity level; string name; string description; std::optional hint; std::optional nixCode; static std::optional programName; }; std::ostream& operator<<(std::ostream &out, const ErrorInfo &einfo); } #endif