aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBen Burdette <bburdette@gmail.com>2020-03-24 11:21:35 -0600
committerBen Burdette <bburdette@gmail.com>2020-03-24 11:21:35 -0600
commit0166e7ab6d1d4530e9d6d9562693a58ab54c36ba (patch)
treeb0bc6679386153dd2786f2a3cfdaf7f425a2c9f4 /src
parent4171ab4bbd95e9bb4b9d6c6e8c143002d92b0c06 (diff)
MkNixCode, MkErrLine approach
Diffstat (limited to 'src')
-rw-r--r--src/libutil/error.cc6
-rw-r--r--src/libutil/error.hh187
2 files changed, 175 insertions, 18 deletions
diff --git a/src/libutil/error.cc b/src/libutil/error.cc
index 81c1f1805..f258d6a83 100644
--- a/src/libutil/error.cc
+++ b/src/libutil/error.cc
@@ -94,7 +94,11 @@ void print_error(ErrorInfo &einfo)
level_string = "warning:"; // TODO make yellow.
break;
}
- }
+ default:
+ {
+ level_string = "wat:";
+ break;
+ }}
int ndl = level_string.length() + 3 + einfo.name.length() + einfo.program.length();
int dashwidth = errwidth - 3 ? 3 : 80 - ndl;
diff --git a/src/libutil/error.hh b/src/libutil/error.hh
index 69776eb8c..9449540af 100644
--- a/src/libutil/error.hh
+++ b/src/libutil/error.hh
@@ -3,6 +3,7 @@
#include "types.hh"
#include <string>
#include <optional>
+#include <iostream>
using std::string;
using std::optional;
@@ -16,35 +17,171 @@ enum ErrLevel
class ColumnRange {
public:
- unsigned int start;
- unsigned int len;
+ unsigned int start;
+ unsigned int len;
};
+class ErrorInfo;
+
+// -------------------------------------------------
+// forward declarations before ErrLine.
+template <class T>
+class AddLineNumber;
+
+template <class T>
+class AddColumnRange;
+
+template <class T>
+class AddLOC;
+
class ErrLine {
public:
- int lineNumber;
- optional<ColumnRange> columnRange;
- optional<string> prevLineOfCode;
- string errLineOfCode;
- optional<string> nextLineOfCode;
+ int lineNumber;
+ optional<ColumnRange> columnRange;
+ optional<string> prevLineOfCode;
+ string errLineOfCode;
+ optional<string> nextLineOfCode;
+
+ friend AddLineNumber<ErrLine>;
+ friend AddColumnRange<ErrLine>;
+ friend AddLOC<ErrLine>;
+ ErrLine& GetEL() { return *this; }
+ private:
+ ErrLine() {}
+};
+
+template <class T>
+class AddLineNumber : public T
+{
+ public:
+ T& lineNumber(int lineNumber) {
+ GetEL().lineNumber = lineNumber;
+ return *this;
+ }
+ protected:
+ ErrLine& GetEL() { return T::GetEL(); }
+};
+
+template <class T>
+class AddColumnRange : public T
+{
+ public:
+ T& columnRange(unsigned int start, unsigned int len) {
+ GetEL().columnRange = { start, len };
+ return *this;
+ }
+ protected:
+ ErrLine& GetEL() { return T::GetEL(); }
+};
+
+template <class T>
+class AddLOC : public T
+{
+ public:
+ T& linesOfCode(optional<string> prevloc, string loc, optional<string> nextloc) {
+ GetEL().prevLineOfCode = prevloc;
+ GetEL().errLineOfCode = loc;
+ GetEL().nextLineOfCode = nextloc;
+ return *this;
+ }
+ protected:
+ ErrLine& GetEL() { return T::GetEL(); }
};
+typedef AddLineNumber<AddColumnRange<AddLOC<ErrLine>>> MkErrLine;
+MkErrLine mkErrLine;
+
+
+// -------------------------------------------------
+// NixCode.
+
+template <class T>
+class AddNixFile;
+
+template <class T>
+class AddErrLine;
+
class NixCode {
public:
- optional<string> nixFile;
- optional<ErrLine> errLine;
+ optional<string> nixFile;
+ optional<ErrLine> errLine;
+
+ friend AddNixFile<NixCode>;
+ friend AddErrLine<NixCode>;
+ friend ErrorInfo;
+ NixCode& GetNC() { return *this; }
+ private:
+ NixCode() {}
+};
+
+template <class T>
+class AddNixFile : public T
+{
+ public:
+ T& nixFile(string filename) {
+ GetNC().nixFile = filename;
+ return *this;
+ }
+ protected:
+ NixCode& GetNC() { return T::GetNC(); }
+};
+
+template <class T>
+class AddErrLine : public T
+{
+ public:
+ T& errLine(ErrLine errline) {
+ GetNC().errLine = errline;
+ return *this;
+ }
+ protected:
+ NixCode& GetNC() { return T::GetNC(); }
};
+typedef AddNixFile<AddErrLine<NixCode>> MkNixCode;
+
+// -------------------------------------------------
+// ErrorInfo.
+
+template <class T>
+class AddName;
+
+template <class T>
+class AddDescription;
+
+template <class T>
+class AddNixCode;
class ErrorInfo {
public:
- ErrLevel level;
- string name;
- string description;
- string program;
- optional<NixCode> nixCode;
- string hint;
- ErrorInfo& GetEI() { return *this; }
+ ErrLevel level;
+ string name;
+ string description;
+ string program;
+ optional<NixCode> nixCode;
+ string hint;
+ ErrorInfo& GetEI() { return *this; }
+
+ // give these access to the private constructor,
+ // when they are direct descendants.
+ friend AddName<ErrorInfo>;
+ friend AddDescription<ErrorInfo>;
+ friend AddNixCode<ErrorInfo>;
+
+ protected:
+ ErrorInfo(ErrLevel level) { this->level = level; }
+};
+
+class EIError : public ErrorInfo
+{
+ protected:
+ EIError() : ErrorInfo(elError) {}
+};
+
+class EIWarning : public ErrorInfo
+{
+ protected:
+ EIWarning() : ErrorInfo(elWarning) {}
};
template <class T>
@@ -71,7 +208,23 @@ class AddDescription : private T
ErrorInfo& GetEI() { return T::GetEI(); }
};
-typedef AddName<AddDescription<ErrorInfo>> StandardError;
+template <class T>
+class AddNixCode : private T
+{
+ public:
+ T& nixcode(const NixCode &nixcode){
+ GetEI().nixCode = nixcode;
+ return *this;
+ }
+ protected:
+ ErrorInfo& GetEI() { return T::GetEI(); }
+};
+
+typedef AddName<AddDescription<EIError>> StandardError;
+typedef AddName<AddDescription<EIWarning>> StandardWarning;
+
+typedef AddName<AddDescription<AddNixCode<EIError>>> MkNixError;
+typedef AddName<AddDescription<AddNixCode<EIWarning>>> MkNixWarning;
string showErrLine(ErrLine &errLine);