[ci] Test Tcl bindings for dragonfly/freebsd
[xapian.git] / xapian-applications / omega / jsonescape.h
bloba13e26805cad864692213fac7cab6850b8cbf638
1 /** @file
2 * @brief JSON escaping
3 */
4 /* Copyright (C) 2013,2018,2019,2021 Olly Betts
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22 * IN THE SOFTWARE.
25 #ifndef OMEGA_INCLUDED_JSONESCAPE_H
26 #define OMEGA_INCLUDED_JSONESCAPE_H
28 #include <string>
30 void json_escape(std::string &s);
32 /// Convert a C++ std::map to JSON.
33 template<typename C, typename F1, typename F2>
34 static inline std::string
35 to_json(const C& container, F1 func1, F2 func2)
37 std::string result = "{\"";
38 bool first = true;
39 for (auto entry : container) {
40 if (first) {
41 first = false;
42 } else {
43 result += ",\"";
45 std::string key = func1(entry.first);
46 json_escape(key);
47 result += key;
48 result += "\":";
49 result += func2(entry.second);
51 if (first) {
52 // Special case for an empty object.
53 result = "{}";
54 } else {
55 result += "}";
57 return result;
60 #endif // OMEGA_INCLUDED_JSONESCAPE_H