diff options
author | Maxim Yurchuk <maxim-yurchuk@ydb.tech> | 2024-10-18 20:31:38 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-18 20:31:38 +0300 |
commit | 2a74bac2d2d3bccb4e10120f1ead805640ec9dd0 (patch) | |
tree | 047e4818ced5aaf73f58517629e5260b5291f9f0 /contrib/libs/jinja2cpp/src/filesystem_handler.cpp | |
parent | 2d9656823e9521d8c29ea4c9a1d0eab78391abfc (diff) | |
parent | 3d834a1923bbf9403cd4a448e7f32b670aa4124f (diff) | |
download | ydb-2a74bac2d2d3bccb4e10120f1ead805640ec9dd0.tar.gz |
Merge pull request #10502 from ydb-platform/mergelibs-241016-1210
Library import 241016-1210
Diffstat (limited to 'contrib/libs/jinja2cpp/src/filesystem_handler.cpp')
-rw-r--r-- | contrib/libs/jinja2cpp/src/filesystem_handler.cpp | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/contrib/libs/jinja2cpp/src/filesystem_handler.cpp b/contrib/libs/jinja2cpp/src/filesystem_handler.cpp new file mode 100644 index 0000000000..8325487aff --- /dev/null +++ b/contrib/libs/jinja2cpp/src/filesystem_handler.cpp @@ -0,0 +1,163 @@ +#include <jinja2cpp/filesystem_handler.h> +#include <jinja2cpp/string_helpers.h> + +#include <boost/filesystem/path.hpp> +#include <boost/filesystem/operations.hpp> + +#include <sstream> +#include <fstream> + +namespace jinja2 +{ + +using TargetFileStream = std::variant<CharFileStreamPtr*, WCharFileStreamPtr*>; + +struct FileContentConverter +{ + void operator() (const std::string& content, CharFileStreamPtr* sPtr) const + { + sPtr->reset(new std::istringstream(content)); + } + + void operator() (const std::wstring& content, WCharFileStreamPtr* sPtr) const + { + sPtr->reset(new std::wistringstream(content)); + } + void operator() (const std::wstring&, CharFileStreamPtr*) const + { +// CharFileStreamPtr stream(new std::istringstream(content), [](std::istream* s) {delete static_cast<std::istringstream>(s);}); +// std::swap(*sPtr, stream); + } + + void operator() (const std::string&, WCharFileStreamPtr*) const + { +// WCharFileStreamPtr stream(new std::wistringstream(content), [](std::wistream* s) {delete static_cast<std::wistringstream>(s);}); +// std::swap(*sPtr, stream); + } +}; + +void MemoryFileSystem::AddFile(std::string fileName, std::string fileContent) +{ + m_filesMap[std::move(fileName)] = FileContent{std::move(fileContent), {}}; +} + +void MemoryFileSystem::AddFile(std::string fileName, std::wstring fileContent) +{ + m_filesMap[std::move(fileName)] = FileContent{ {}, std::move(fileContent) }; +} + +CharFileStreamPtr MemoryFileSystem::OpenStream(const std::string& name) const +{ + CharFileStreamPtr result(nullptr, [](std::istream* s) {delete static_cast<std::istringstream*>(s);}); + auto p = m_filesMap.find(name); + if (p == m_filesMap.end()) + return result; + + auto& content = p->second; + + if (!content.narrowContent && !content.wideContent) + return result; + + if (!content.narrowContent) + content.narrowContent = ConvertString<std::string>(content.wideContent.value()); + + result.reset(new std::istringstream(content.narrowContent.value())); + + return result; +} + +WCharFileStreamPtr MemoryFileSystem::OpenWStream(const std::string& name) const +{ + WCharFileStreamPtr result(nullptr, [](std::wistream* s) {delete static_cast<std::wistringstream*>(s);}); + auto p = m_filesMap.find(name); + if (p == m_filesMap.end()) + return result; + + auto& content = p->second; + + if (!content.narrowContent && !content.wideContent) + return result; + + if (!content.wideContent) + content.wideContent = ConvertString<std::wstring>(content.narrowContent.value()); + + result.reset(new std::wistringstream(content.wideContent.value())); + + return result; +} +std::optional<std::chrono::system_clock::time_point> MemoryFileSystem::GetLastModificationDate(const std::string&) const +{ + return std::optional<std::chrono::system_clock::time_point>(); +} + +bool MemoryFileSystem::IsEqual(const IComparable& other) const +{ + auto* ptr = dynamic_cast<const MemoryFileSystem*>(&other); + if (!ptr) + return false; + return m_filesMap == ptr->m_filesMap; +} + +RealFileSystem::RealFileSystem(std::string rootFolder) + : m_rootFolder(std::move(rootFolder)) +{ + +} + +std::string RealFileSystem::GetFullFilePath(const std::string& name) const +{ + boost::filesystem::path root(m_rootFolder); + root /= name; + return root.string(); +} + +CharFileStreamPtr RealFileSystem::OpenStream(const std::string& name) const +{ + auto filePath = GetFullFilePath(name); + + CharFileStreamPtr result(new std::ifstream(filePath), [](std::istream* s) {delete static_cast<std::ifstream*>(s);}); + if (result->good()) + return result; + + return CharFileStreamPtr(nullptr, [](std::istream*){}); +} + +WCharFileStreamPtr RealFileSystem::OpenWStream(const std::string& name) const +{ + auto filePath = GetFullFilePath(name); + + WCharFileStreamPtr result(new std::wifstream(filePath), [](std::wistream* s) {delete static_cast<std::wifstream*>(s);}); + if (result->good()) + return result; + + return WCharFileStreamPtr(nullptr, [](std::wistream*){;}); +} +std::optional<std::chrono::system_clock::time_point> RealFileSystem::GetLastModificationDate(const std::string& name) const +{ + boost::filesystem::path root(m_rootFolder); + root /= name; + + auto modify_time = boost::filesystem::last_write_time(root); + + return std::chrono::system_clock::from_time_t(modify_time); +} +CharFileStreamPtr RealFileSystem::OpenByteStream(const std::string& name) const +{ + auto filePath = GetFullFilePath(name); + + CharFileStreamPtr result(new std::ifstream(filePath, std::ios_base::binary), [](std::istream* s) {delete static_cast<std::ifstream*>(s);}); + if (result->good()) + return result; + + return CharFileStreamPtr(nullptr, [](std::istream*){}); +} + +bool RealFileSystem::IsEqual(const IComparable& other) const +{ + auto* ptr = dynamic_cast<const RealFileSystem*>(&other); + if (!ptr) + return false; + return m_rootFolder == ptr->m_rootFolder; +} + +} // namespace jinja2 |