#pragma once #include "types.hh" #include #include using std::string; using std::optional; namespace nix { enum ErrLevel { elWarning , elError }; class ColumnRange { public: unsigned int start; unsigned int len; }; class ErrLine { public: int lineNumber; optional columnRange; optional prevLineOfCode; string errLineOfCode; optional nextLineOfCode; }; class NixCode { public: optional nixFile; optional errLine; }; class ErrorInfo { public: ErrLevel level; string name; string description; string program; optional nixCode; string hint; ErrorInfo& GetEI() { return *this; } }; template class AddName : private T { public: T& name(const std::string &name){ GetEI().name = name; return *this; } protected: ErrorInfo& GetEI() { return T::GetEI(); } }; template class AddDescription : private T { public: T& description(const std::string &description){ GetEI().description = description; return *this; } protected: ErrorInfo& GetEI() { return T::GetEI(); } }; typedef AddName> StandardError; string showErrLine(ErrLine &errLine); void print_code_lines(string &prefix, NixCode &nix_code); void print_error(ErrorInfo &einfo); }