85f8a1671727d7fae7177459649587fffdbda3eb
[archive/platform/core/system/libConfig.git] / src / config / to-json-visitor.hpp
1 /*
2  *  Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
3  *
4  *  Contact: Piotr Bartosiewicz (p.bartosiewi@partner.samsung.com)
5  *
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
9  *
10  *      http://www.apache.org/licenses/LICENSE-2.0
11  *
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
17  */
18
19 /**
20  * @file
21  * @author  Piotr Bartosiewicz (p.bartosiewi@partner.samsung.com)
22  * @brief   JSON visitor
23  */
24
25 #ifndef CONFIG_TO_JSON_VISITOR_HPP
26 #define CONFIG_TO_JSON_VISITOR_HPP
27
28 #include "config/is-visitable.hpp"
29
30 #include <json/json.h>
31 #include <string>
32 #include <vector>
33
34 namespace config {
35
36 class ToJsonVisitor {
37
38 public:
39     ToJsonVisitor()
40         : mObject(json_object_new_object())
41     {
42     }
43
44     ToJsonVisitor(const ToJsonVisitor& visitor)
45         : mObject(json_object_get(visitor.mObject))
46     {
47     }
48
49     ~ToJsonVisitor()
50     {
51         json_object_put(mObject);
52     }
53
54     ToJsonVisitor& operator=(const ToJsonVisitor&) = delete;
55
56     std::string toString() const
57     {
58         return json_object_to_json_string(mObject);
59     }
60
61     template<typename T>
62     void visit(const std::string& name, const T& value)
63     {
64         json_object_object_add(mObject, name.c_str(), toJsonObject(value));
65     }
66 private:
67     json_object* mObject;
68
69
70     json_object* detach()
71     {
72         json_object* ret = mObject;
73         mObject = nullptr;
74         return ret;
75     }
76
77     static json_object* toJsonObject(int value)
78     {
79         return json_object_new_int(value);
80     }
81
82     static json_object* toJsonObject(std::int64_t value)
83     {
84         return json_object_new_int64(value);
85     }
86
87     static json_object* toJsonObject(bool value)
88     {
89         return json_object_new_boolean(value);
90     }
91
92     static json_object* toJsonObject(double value)
93     {
94         return json_object_new_double(value);
95     }
96
97     static json_object* toJsonObject(const std::string& value)
98     {
99         return json_object_new_string(value.c_str());
100     }
101
102     template<typename T>
103     static json_object* toJsonObject(const std::vector<T>& value)
104     {
105         json_object* array = json_object_new_array();
106         for (const T& v : value) {
107             json_object_array_add(array, toJsonObject(v));
108         }
109         return array;
110     }
111
112     template<typename T, class = typename std::enable_if<isVisitable<T>::value>::type>
113     static json_object* toJsonObject(const T& value)
114     {
115         ToJsonVisitor visitor;
116         value.accept(visitor);
117         return visitor.detach();
118     }
119 };
120
121 } // namespace config
122
123 #endif // CONFIG_TO_JSON_VISITOR_HPP