mirror of
https://github.com/pantor/inja.git
synced 2026-06-07 19:39:44 +00:00
419c93c840
* throw exception if a file cannot be opened * Add a new function in utils.hpp: open_file_or_throw: This function returns an opened std::ifstream or throws by calling `inja_throw`. * Use this function in Parser::load_file which previously returned an empty string if the file couldn't be opened. * Use this function in Environment::load_json which previously threw a `nlohmann::detail::parse_error` if the file couldn't be opened. * In Parser::parse_statement: When including files through `include`, do not attempt to (re-)parse templates from files that were already included. Additionally, this prevents inja from attempting to load in-memory templates by their name from disk. * Add tests that check if an exception is thrown when attempting to open files that do not exist. * cmake: enable C++11 * cmake: require C++11 when depending on single_inja * code style
50 lines
1.5 KiB
C++
50 lines
1.5 KiB
C++
#ifndef PANTOR_INJA_UTILS_HPP
|
|
#define PANTOR_INJA_UTILS_HPP
|
|
|
|
#include <fstream>
|
|
#include <stdexcept>
|
|
|
|
#include "string_view.hpp"
|
|
|
|
|
|
namespace inja {
|
|
|
|
inline void inja_throw(const std::string& type, const std::string& message) {
|
|
throw std::runtime_error("[inja.exception." + type + "] " + message);
|
|
}
|
|
|
|
inline std::ifstream open_file_or_throw(const std::string& path) {
|
|
std::ifstream file;
|
|
file.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
|
try {
|
|
file.open(path);
|
|
} catch(const std::ios_base::failure& e) {
|
|
inja_throw("file_error", "failed accessing file at '" + path + "'");
|
|
}
|
|
return file;
|
|
}
|
|
|
|
namespace string_view {
|
|
inline nonstd::string_view slice(nonstd::string_view view, size_t start, size_t end) {
|
|
start = std::min(start, view.size());
|
|
end = std::min(std::max(start, end), view.size());
|
|
return view.substr(start, end - start); // StringRef(Data + Start, End - Start);
|
|
}
|
|
|
|
inline std::pair<nonstd::string_view, nonstd::string_view> split(nonstd::string_view view, char Separator) {
|
|
size_t idx = view.find(Separator);
|
|
if (idx == nonstd::string_view::npos) {
|
|
return std::make_pair(view, nonstd::string_view());
|
|
}
|
|
return std::make_pair(slice(view, 0, idx), slice(view, idx + 1, nonstd::string_view::npos));
|
|
}
|
|
|
|
inline bool starts_with(nonstd::string_view view, nonstd::string_view prefix) {
|
|
return (view.size() >= prefix.size() && view.compare(0, prefix.size(), prefix) == 0);
|
|
}
|
|
} // namespace string
|
|
|
|
} // namespace inja
|
|
|
|
#endif // PANTOR_INJA_UTILS_HPP
|