#ifndef JSONNET_STATIC_ERROR_H
#define JSONNET_STATIC_ERROR_H
#include <iostream>
#include <sstream>
struct Location {
unsigned long line;
unsigned long column;
Location(void) : line(0), column(0) {}
Location(unsigned long line, unsigned long column) : line(line), column(column) {}
bool isSet(void) const
{
return line != 0;
}
Location successor(void) const
{
return Location(this->line, this->column + 1);
}
};
static inline std::ostream &operator<<(std::ostream &o, const Location &loc)
{
o << loc.line << ":" << loc.column;
return o;
}
struct LocationRange {
std::string file;
Location begin, end;
LocationRange(void) {}
LocationRange(const std::string &msg) : file(msg) {}
LocationRange(const std::string &file, const Location &begin, const Location &end)
: file(file), begin(begin), end(end)
{
}
bool isSet(void) const
{
return begin.isSet();
}
};
static inline std::ostream &operator<<(std::ostream &o, const LocationRange &loc)
{
if (loc.file.length() > 0)
o << loc.file;
if (loc.isSet()) {
if (loc.file.length() > 0)
o << ":";
if (loc.begin.line == loc.end.line) {
if (loc.begin.column == loc.end.column - 1) {
o << loc.begin;
} else {
o << loc.begin << "-" << loc.end.column;
}
} else {
o << "(" << loc.begin << ")-(" << loc.end << ")";
}
}
return o;
}
struct StaticError {
LocationRange location;
std::string msg;
StaticError(const std::string &msg) : msg(msg) {}
StaticError(const std::string &filename, const Location &location, const std::string &msg)
: location(filename, location, location.successor()), msg(msg)
{
}
StaticError(const LocationRange &location, const std::string &msg)
: location(location), msg(msg)
{
}
std::string toString() const
{
std::stringstream ss;
if (location.isSet()) {
ss << location << ":";
}
ss << " " << msg;
return ss.str();
}
};
static inline std::ostream &operator<<(std::ostream &o, const StaticError &err)
{
o << err.toString();
return o;
}
#endif