#pragma once #include #include #include namespace json { class Exception : public std::exception { private: std::string whatstr; public: Exception(std::string base, std::string source, int index) { //std::ostringstream s; int counter = 0; int line = 1; int column = 0; std::string lastline = ""; std::string whitespace = ""; for (auto c: source) { if (counter == index) { break; } if (c == '\n') { line++; column = 0; lastline = ""; whitespace = ""; } else if (c == '\t') { column++; lastline += " "; whitespace += " "; } else { column++; lastline += c; whitespace += " "; } counter++; } while (counter < source.size()) { auto c = source[counter]; if (c == '\n') { break; } lastline += c; counter++; } // TODO: Migrate the below code bits to std::format /* s << base << " at line " << line << ", column " << column << std::endl; s << lastline << std::endl; s << whitespace << "^";*/ whatstr = std::format("{} at line {}, column {}\n{}\n{}^", base, line, column, lastline, whitespace); }; virtual const char* what() const throw() { return whatstr.c_str(); } }; class file_error : public std::runtime_error { }; class io_error : public std::runtime_error { }; class parse_error : public std::runtime_error { }; class json_runtime_error : public std::runtime_error { }; }