2 * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Piotr Bartosiewicz (p.bartosiewi@partner.samsung.com)
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License
21 * @author Piotr Bartosiewicz (p.bartosiewi@partner.samsung.com)
25 #ifndef CONFIG_TO_JSON_VISITOR_HPP
26 #define CONFIG_TO_JSON_VISITOR_HPP
28 #include "config/is-visitable.hpp"
29 #include "config/exception.hpp"
31 #include <json/json.h>
41 : mObject(json_object_new_object())
45 ToJsonVisitor(const ToJsonVisitor& visitor)
46 : mObject(json_object_get(visitor.mObject))
52 json_object_put(mObject);
55 ToJsonVisitor& operator=(const ToJsonVisitor&) = delete;
57 std::string toString() const
59 return json_object_to_json_string(mObject);
63 void visit(const std::string& name, const T& value)
65 json_object_object_add(mObject, name.c_str(), toJsonObject(value));
73 json_object* ret = mObject;
78 static json_object* toJsonObject(std::int32_t value)
80 return json_object_new_int(value);
83 static json_object* toJsonObject(std::int64_t value)
85 return json_object_new_int64(value);
88 static json_object* toJsonObject(std::uint32_t value)
90 if (value > INT32_MAX) {
91 throw ConfigException("Value out of range");
93 return json_object_new_int(value);
96 static json_object* toJsonObject(std::uint64_t value)
98 if (value > INT64_MAX) {
99 throw ConfigException("Value out of range");
101 return json_object_new_int64(value);
104 static json_object* toJsonObject(bool value)
106 return json_object_new_boolean(value);
109 static json_object* toJsonObject(double value)
111 return json_object_new_double(value);
114 static json_object* toJsonObject(const std::string& value)
116 return json_object_new_string(value.c_str());
120 static json_object* toJsonObject(const std::vector<T>& value)
122 json_object* array = json_object_new_array();
123 for (const T& v : value) {
124 json_object_array_add(array, toJsonObject(v));
129 template<typename T, class = typename std::enable_if<isVisitable<T>::value>::type>
130 static json_object* toJsonObject(const T& value)
132 ToJsonVisitor visitor;
133 value.accept(visitor);
134 return visitor.detach();
138 } // namespace config
140 #endif // CONFIG_TO_JSON_VISITOR_HPP