#include "jinja2cpp/template.h" #include "template_impl.h" #include #include #include namespace jinja2 { bool operator==(const Template& lhs, const Template& rhs) { return lhs.IsEqual(rhs); } bool operator==(const TemplateW& lhs, const TemplateW& rhs) { return lhs.IsEqual(rhs); } template auto GetImpl(std::shared_ptr impl) { return static_cast*>(impl.get()); } Template::Template(TemplateEnv* env) : m_impl(new TemplateImpl(env)) { } Template::~Template() = default; Result Template::Load(const char* tpl, std::string tplName) { std::string t(tpl); auto result = GetImpl(m_impl)->Load(std::move(t), std::move(tplName)); return !result ? Result() : nonstd::make_unexpected(std::move(result.get())); } Result Template::Load(const std::string& str, std::string tplName) { auto result = GetImpl(m_impl)->Load(str, std::move(tplName)); return !result ? Result() : nonstd::make_unexpected(std::move(result.get())); } Result Template::Load(std::istream& stream, std::string tplName) { std::string t; while (stream.good() && !stream.eof()) { char buff[0x10000]; stream.read(buff, sizeof(buff)); auto read = stream.gcount(); if (read) t.append(buff, buff + read); } auto result = GetImpl(m_impl)->Load(std::move(t), std::move(tplName)); return !result ? Result() : nonstd::make_unexpected(std::move(result.get())); } Result Template::LoadFromFile(const std::string& fileName) { std::ifstream file(fileName); if (!file.good()) return Result(); return Load(file, fileName); } Result Template::Render(std::ostream& os, const jinja2::ValuesMap& params) { std::string buffer; auto result = GetImpl(m_impl)->Render(buffer, params); if (!result) os.write(buffer.data(), buffer.size()); return !result ? Result() : nonstd::make_unexpected(std::move(result.get())); } Result Template::RenderAsString(const jinja2::ValuesMap& params) { std::string buffer; auto result = GetImpl(m_impl)->Render(buffer, params); return !result ? Result(std::move(buffer)) : Result(nonstd::make_unexpected(std::move(result.get())));; } Result Template::GetMetadata() { return GetImpl(m_impl)->GetMetadata(); } Result> Template::GetMetadataRaw() { return GetImpl(m_impl)->GetMetadataRaw(); } bool Template::IsEqual(const Template& other) const { return m_impl == other.m_impl; } TemplateW::TemplateW(TemplateEnv* env) : m_impl(new TemplateImpl(env)) { } TemplateW::~TemplateW() = default; ResultW TemplateW::Load(const wchar_t* tpl, std::string tplName) { std::wstring t(tpl); auto result = GetImpl(m_impl)->Load(t, std::move(tplName)); return !result ? ResultW() : nonstd::make_unexpected(std::move(result.get())); } ResultW TemplateW::Load(const std::wstring& str, std::string tplName) { auto result = GetImpl(m_impl)->Load(str, std::move(tplName)); return !result ? ResultW() : nonstd::make_unexpected(std::move(result.get())); } ResultW TemplateW::Load(std::wistream& stream, std::string tplName) { std::wstring t; while (stream.good() && !stream.eof()) { wchar_t buff[0x10000]; stream.read(buff, sizeof(buff)); auto read = stream.gcount(); if (read) t.append(buff, buff + read); } auto result = GetImpl(m_impl)->Load(t, std::move(tplName)); return !result ? ResultW() : nonstd::make_unexpected(std::move(result.get())); } ResultW TemplateW::LoadFromFile(const std::string& fileName) { std::wifstream file(fileName); if (!file.good()) return ResultW(); return Load(file, fileName); } ResultW TemplateW::Render(std::wostream& os, const jinja2::ValuesMap& params) { std::wstring buffer; auto result = GetImpl(m_impl)->Render(buffer, params); if (!result) os.write(buffer.data(), buffer.size()); return !result ? ResultW() : ResultW(nonstd::make_unexpected(std::move(result.get()))); } ResultW TemplateW::RenderAsString(const jinja2::ValuesMap& params) { std::wstring buffer; auto result = GetImpl(m_impl)->Render(buffer, params); return !result ? buffer : ResultW(nonstd::make_unexpected(std::move(result.get()))); } ResultW TemplateW::GetMetadata() { return GenericMap(); // GetImpl(m_impl)->GetMetadata(); } ResultW> TemplateW::GetMetadataRaw() { return MetadataInfo(); // GetImpl(m_impl)->GetMetadataRaw(); ; } bool TemplateW::IsEqual(const TemplateW& other) const { return m_impl == other.m_impl; } } // namespace jinja2