#pragma once #include #include #include "../render_context.hpp" #include "../utils.hpp" #include "mstch/mstch.hpp" namespace mstch { class render_node : public boost::static_visitor { public: enum class flag { none, escape_html }; render_node(render_context &ctx, flag p_flag = flag::none) : m_ctx(ctx), m_flag(p_flag) {} template std::string operator()(const T &) const { return ""; } std::string operator()(const int &value) const { return std::to_string(value); } std::string operator()(const double &value) const { std::stringstream ss; ss << value; return ss.str(); } std::string operator()(const bool &value) const { return value ? "true" : "false"; } std::string operator()(const lambda &value) const { template_type interpreted{value([this](const mstch::node &n) { return visit(render_node(m_ctx), n); })}; auto rendered = render_context::push(m_ctx).render(interpreted); return (m_flag == flag::escape_html) ? html_escape(rendered) : rendered; } std::string operator()(const std::string &value) const { return (m_flag == flag::escape_html) ? html_escape(value) : value; } private: render_context &m_ctx; flag m_flag; }; }