#pragma once #include #include "../render_context.hpp" #include "../utils.hpp" #include "mstch/mstch.hpp" #include "render_node.hpp" namespace mstch { class render_section : public boost::static_visitor { public: enum class flag { none, keep_array }; render_section(render_context &ctx, const template_type §ion, const delim_type &delims, flag p_flag = flag::none) : m_ctx(ctx), m_section(section), m_delims(delims), m_flag(p_flag) { } template std::string operator()(const T &t) const { return render_context::push(m_ctx, t).render(m_section); } std::string operator()(const lambda &fun) const { std::string section_str; for (auto &token : m_section) section_str += token.raw(); template_type interpreted{fun([this](const mstch::node &n) { return visit(render_node(m_ctx), n); }, section_str), m_delims}; return render_context::push(m_ctx).render(interpreted); } std::string operator()(const array &array) const { std::string out; if (m_flag == flag::keep_array) return render_context::push(m_ctx, array).render(m_section); else for (auto &item : array) out += visit(render_section(m_ctx, m_section, m_delims, flag::keep_array), item); return out; } private: render_context &m_ctx; const template_type &m_section; const delim_type &m_delims; flag m_flag; }; }