#ifndef INCLUDE_INJA_EXCEPTIONS_HPP_ #define INCLUDE_INJA_EXCEPTIONS_HPP_ #include #include namespace inja { struct SourceLocation { size_t line; size_t column; }; struct InjaError : public std::runtime_error { const std::string type; const std::string message; const SourceLocation location; explicit InjaError(const std::string &type, const std::string &message) : std::runtime_error("[inja.exception." + type + "] " + message), type(type), message(message), location({0, 0}) {} explicit InjaError(const std::string &type, const std::string &message, SourceLocation location) : std::runtime_error("[inja.exception." + type + "] (at " + std::to_string(location.line) + ":" + std::to_string(location.column) + ") " + message), type(type), message(message), location(location) {} }; struct ParserError : public InjaError { explicit ParserError(const std::string &message, SourceLocation location) : InjaError("parser_error", message, location) {} }; struct RenderError : public InjaError { explicit RenderError(const std::string &message, SourceLocation location) : InjaError("render_error", message, location) {} }; struct FileError : public InjaError { explicit FileError(const std::string &message) : InjaError("file_error", message) {} explicit FileError(const std::string &message, SourceLocation location) : InjaError("file_error", message, location) {} }; struct JsonError : public InjaError { explicit JsonError(const std::string &message, SourceLocation location) : InjaError("json_error", message, location) {} }; } // namespace inja #endif // INCLUDE_INJA_EXCEPTIONS_HPP_