diff options
author | Carlo Nucera <carlo.nucera@protonmail.com> | 2020-05-28 10:58:22 -0400 |
---|---|---|
committer | Carlo Nucera <carlo.nucera@protonmail.com> | 2020-05-28 10:58:22 -0400 |
commit | 4f597fb901dec55a86a2b29a122b9007177b2358 (patch) | |
tree | c89fff8fb0670fb55eb0c2593b6b48575a2ef914 /src/libutil/error.hh | |
parent | 87b32bab05ff91981c8847d66cd5502feb44f3b5 (diff) | |
parent | f60ce4fa207a210e23a1142d3a8ead611526e6e1 (diff) |
Merge branch 'master' of github.com:NixOS/nix into enum-class
Diffstat (limited to 'src/libutil/error.hh')
-rw-r--r-- | src/libutil/error.hh | 121 |
1 files changed, 121 insertions, 0 deletions
diff --git a/src/libutil/error.hh b/src/libutil/error.hh new file mode 100644 index 000000000..f402b692e --- /dev/null +++ b/src/libutil/error.hh @@ -0,0 +1,121 @@ +#ifndef error_hh +#define error_hh + +#include "ansicolor.hh" +#include <string> +#include <optional> +#include <iostream> +#include "types.hh" + +namespace nix +{ + +typedef enum { + elWarning, + elError +} ErrLevel; + +struct ErrPos +{ + int lineNumber; + int column; + string nixFile; + + template <class P> + ErrPos& operator=(const P &pos) + { + lineNumber = pos.line; + column = pos.column; + nixFile = pos.file; + return *this; + } + + template <class P> + ErrPos(const P &p) + { + *this = p; + } +}; + +struct NixCode +{ + ErrPos errPos; + std::optional<string> prevLineOfCode; + string errLineOfCode; + std::optional<string> nextLineOfCode; +}; + +// ---------------------------------------------------------------- +// format function for hints. same as fmt, except templated values +// are always in yellow. + +template <class T> +struct yellowify +{ + yellowify(T &s) : value(s) {} + T &value; +}; + +template <class T> +std::ostream& operator<<(std::ostream &out, const yellowify<T> &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<class T> + hintformat& operator%(const T &value) + { + fmt % yellowify(value); + return *this; + } + + std::string str() const + { + return fmt.str(); + } + + template <typename U> + friend class AddHint; +private: + format fmt; +}; + +std::ostream& operator<<(std::ostream &os, const hintformat &hf); + +template<typename... Args> +inline hintformat hintfmt(const std::string & fs, const Args & ... args) +{ + hintformat f(fs); + formatHelper(f, args...); + return f; +} + +// ------------------------------------------------- +// ErrorInfo. +struct ErrorInfo +{ + ErrLevel level; + string name; + string description; + std::optional<hintformat> hint; + std::optional<NixCode> nixCode; + + static std::optional<string> programName; +}; + +// -------------------------------------------------------- +// error printing + +// just to cout for now. +void printErrorInfo(const ErrorInfo &einfo); + +} + +#endif |