#include <boost/variant.hpp>
#include <boost/spirit/include/karma.hpp>
namespace karma = boost::spirit::karma;
typedef boost::variant<int, std::string> Parameter;
typedef std::vector<Parameter> Parameters;
void test(boost::variant<Parameters, Parameter> const& v)
{
typedef boost::spirit::ostream_iterator It;
using namespace karma;
const static rule<It, std::string()> quoted
= '"' << *('\\' << char_('"') | char_) << '"'
;
const static rule<It, Parameter()> param
= int_ | quoted
;
const static rule<It, boost::variant<Parameters, Parameter>()> rule
= param | param % ", "
;
std::cout << karma::format(rule, v) << '\n';
}
int main()
{
test(1);
test("foo");
test("escape: \"foo\"");
test(Parameters { 1, 2, 3, "escape: \"foo\"" });
}
I2luY2x1ZGUgPGJvb3N0L3ZhcmlhbnQuaHBwPgojaW5jbHVkZSA8Ym9vc3Qvc3Bpcml0L2luY2x1ZGUva2FybWEuaHBwPgoKbmFtZXNwYWNlIGthcm1hID0gYm9vc3Q6OnNwaXJpdDo6a2FybWE7CnR5cGVkZWYgYm9vc3Q6OnZhcmlhbnQ8aW50LCBzdGQ6OnN0cmluZz4gUGFyYW1ldGVyOwp0eXBlZGVmIHN0ZDo6dmVjdG9yPFBhcmFtZXRlcj4gUGFyYW1ldGVyczsKCnZvaWQgdGVzdChib29zdDo6dmFyaWFudDxQYXJhbWV0ZXJzLCBQYXJhbWV0ZXI+IGNvbnN0JiB2KQp7CiAgICB0eXBlZGVmIGJvb3N0OjpzcGlyaXQ6Om9zdHJlYW1faXRlcmF0b3IgSXQ7CiAgICB1c2luZyBuYW1lc3BhY2Uga2FybWE7CgogICAgY29uc3Qgc3RhdGljIHJ1bGU8SXQsIHN0ZDo6c3RyaW5nKCk+IHF1b3RlZAogICAgICAgID0gJyInIDw8ICooJ1xcJyA8PCBjaGFyXygnIicpIHwgY2hhcl8pIDw8ICciJwogICAgICAgIDsKICAgIGNvbnN0IHN0YXRpYyBydWxlPEl0LCBQYXJhbWV0ZXIoKT4gICBwYXJhbQogICAgICAgID0gaW50XyB8IHF1b3RlZAogICAgICAgIDsKICAgIGNvbnN0IHN0YXRpYyBydWxlPEl0LCBib29zdDo6dmFyaWFudDxQYXJhbWV0ZXJzLCBQYXJhbWV0ZXI+KCk+IHJ1bGUKICAgICAgICA9IHBhcmFtIHwgcGFyYW0gJSAiLCAiCiAgICAgICAgOwoKICAgIHN0ZDo6Y291dCA8PCBrYXJtYTo6Zm9ybWF0KHJ1bGUsIHYpIDw8ICdcbic7Cn0KCmludCBtYWluKCkKewogICAgdGVzdCgxKTsKICAgIHRlc3QoImZvbyIpOwogICAgdGVzdCgiZXNjYXBlOiBcImZvb1wiIik7CiAgICB0ZXN0KFBhcmFtZXRlcnMgeyAxLCAyLCAzLCAiZXNjYXBlOiBcImZvb1wiIiB9KTsKfQoK