/* 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("y\n<#list> -> \n") * ("p1", "HEAD") * ("c", true) * ("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. * * The elements are: * - Regular parameter: * just replaced * - Condition parameter: ......, where "" is optional * replaced (and recursively expanded) by the first part if the condition is true * and by the second (or empty string if missing) if the condition is false * - List parameter: <#list>... * The part between the tags is repeated as often as values are provided * in the mapping. Each list element can have its own parameter -> value mapping. */ class Whiskers { public: using StringMap = std::map; using StringListMap = std::map>; explicit Whiskers(std::string _template); /// Sets a single regular parameter, . Whiskers& operator()(std::string _parameter, std::string _value); Whiskers& operator()(std::string _parameter, char const* _value) { return (*this)(_parameter, std::string{_value}); } /// Sets a condition parameter, ...... Whiskers& operator()(std::string _parameter, bool _value); /// Sets a list parameter, <#listName> . Whiskers& operator()( std::string _listParameter, std::vector _values ); std::string render() const; private: void checkParameterUnknown(std::string const& _parameter); static std::string replace( std::string const& _template, StringMap const& _parameters, std::map const& _conditions, 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; std::map m_conditions; StringListMap m_listParameters; }; }