/* This file is part of solidity. solidity is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. solidity is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with solidity. If not, see . */ /** @file Whiskers.h * @author Chris * @date 2017 * * Moustache-like templates. */ #pragma once #include #include #include #include namespace dev { DEV_SIMPLE_EXCEPTION(WhiskersError); /// /// Moustache-like templates. /// /// Usage: /// std::vector> listValues(2); /// listValues[0]["k"] = "key1"; /// listValues[0]["v"] = "value1"; /// listValues[1]["k"] = "key2"; /// listValues[1]["v"] = "value2"; /// auto s = Whiskers("\n<#list> -> \n") /// ("p1", "HEAD") /// ("list", listValues) /// .render(); /// /// results in s == "HEAD\nkey1 -> value1\nkey2 -> value2\n" /// /// Note that lists cannot themselves contain lists - this would be a future feature. class Whiskers { public: using StringMap = std::map; using StringListMap = std::map>; explicit Whiskers(std::string const& _template); /// Sets a single parameter, . Whiskers& operator()(std::string const& _parameter, std::string const& _value); /// Sets a list parameter, <#listName> . Whiskers& operator()( std::string const& _listParameter, std::vector const& _values ); std::string render() const; private: static std::string replace( std::string const& _template, StringMap const& _parameters, StringListMap const& _listParameters = StringListMap() ); /// Joins the two maps throwing an exception if two keys are equal. static StringMap joinMaps(StringMap const& _a, StringMap const& _b); std::string m_template; StringMap m_parameters; StringListMap m_listParameters; }; }