Line data Source code
1 : /*
2 : * SPDX-License-Identifier: GPL-3.0-only
3 : * MuseScore-CLA-applies
4 : *
5 : * MuseScore Studio
6 : * Music Composition & Notation
7 : *
8 : * Copyright (C) 2021 MuseScore Limited and others
9 : *
10 : * This program is free software: you can redistribute it and/or modify
11 : * it under the terms of the GNU General Public License version 3 as
12 : * published by the Free Software Foundation.
13 : *
14 : * This program is distributed in the hope that it will be useful,
15 : * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 : * GNU General Public License for more details.
18 : *
19 : * You should have received a copy of the GNU General Public License
20 : * along with this program. If not, see <https://www.gnu.org/licenses/>.
21 : */
22 : #ifndef MUSE_GLOBAL_JSON_H
23 : #define MUSE_GLOBAL_JSON_H
24 :
25 : #include <memory>
26 :
27 : #include "../types/bytearray.h"
28 : #include "../types/string.h"
29 : #include "../types/val.h"
30 :
31 : namespace muse {
32 : struct JsonData;
33 : class JsonArray;
34 : class JsonObject;
35 : class JsonValue
36 : {
37 : public:
38 : JsonValue(bool v);
39 : JsonValue(int v);
40 : JsonValue(double v);
41 : JsonValue(const String& v);
42 : JsonValue(const std::string& v);
43 : JsonValue(const char* v);
44 : JsonValue(const JsonArray& v);
45 : JsonValue(const JsonObject& v);
46 : JsonValue(std::shared_ptr<JsonData> d = nullptr);
47 :
48 : bool isNull() const;
49 : bool isBool() const;
50 : bool isNumber() const;
51 : bool isString() const;
52 : bool isArray() const;
53 : bool isObject() const;
54 :
55 : bool toBool() const;
56 : int toInt() const;
57 : double toDouble() const;
58 : String toString() const;
59 : const std::string& toStdString() const;
60 : JsonArray toArray() const;
61 : JsonObject toObject() const;
62 :
63 : Val toVal() const;
64 : static JsonValue fromVal(const Val& val);
65 :
66 : void setNull();
67 : JsonValue& operator=(bool v);
68 : JsonValue& operator=(int v);
69 : JsonValue& operator=(double v);
70 : JsonValue& operator=(const String& str);
71 : JsonValue& operator=(const std::string& str);
72 : JsonValue& operator=(const char* str);
73 : JsonValue& operator=(const JsonArray& arr);
74 : JsonValue& operator=(const JsonObject& obj);
75 :
76 : private:
77 : friend class JsonObject;
78 : friend class JsonArray;
79 :
80 : void detach();
81 : std::shared_ptr<JsonData> m_data;
82 : };
83 :
84 : class JsonValueRef
85 : {
86 : public:
87 : JsonValueRef(const std::string& key, JsonObject* o);
88 : JsonValueRef(size_t i, JsonArray* a);
89 :
90 : JsonValueRef& operator=(bool v);
91 : JsonValueRef& operator=(int v);
92 : JsonValueRef& operator=(double v);
93 : JsonValueRef& operator=(const String& str);
94 : JsonValueRef& operator=(const std::string& str);
95 : JsonValueRef& operator=(const char* str);
96 : JsonValueRef& operator=(const JsonValue& v);
97 : JsonValueRef& operator=(const JsonArray& arr);
98 : JsonValueRef& operator=(const JsonObject& obj);
99 :
100 : private:
101 : std::string m_key;
102 : JsonObject* m_object = nullptr;
103 :
104 : size_t m_idx = 0;
105 : JsonArray* m_array = nullptr;
106 : };
107 :
108 : class JsonArray
109 : {
110 : public:
111 :
112 : JsonArray(std::shared_ptr<JsonData> d = nullptr);
113 : JsonArray(std::initializer_list<JsonValue> args);
114 :
115 : size_t size() const;
116 : void resize(size_t i);
117 :
118 : bool empty() const;
119 :
120 : JsonValue at(size_t i) const;
121 :
122 : JsonArray& set(size_t i, bool v);
123 : JsonArray& set(size_t i, int v);
124 : JsonArray& set(size_t i, double v);
125 : JsonArray& set(size_t i, const String& str);
126 : JsonArray& set(size_t i, const std::string& str);
127 : JsonArray& set(size_t i, const char* str);
128 : JsonArray& set(size_t i, const JsonValue& v);
129 : JsonArray& set(size_t i, const JsonArray& v);
130 : JsonArray& set(size_t i, const JsonObject& v);
131 :
132 : JsonArray& append(bool v);
133 : JsonArray& append(int v);
134 : JsonArray& append(double v);
135 : JsonArray& append(const String& str);
136 : JsonArray& append(const std::string& str);
137 : JsonArray& append(const char* str);
138 : JsonArray& append(const JsonValue& v);
139 : JsonArray& append(const JsonArray& v);
140 : JsonArray& append(const JsonObject& v);
141 :
142 16 : JsonArray& operator <<(const JsonValue& v) { append(v); return *this; }
143 : JsonArray& operator <<(const JsonArray& v) { append(v); return *this; }
144 636 : JsonArray& operator <<(const JsonObject& v) { append(v); return *this; }
145 :
146 : JsonValue operator [](size_t i) const;
147 : JsonValueRef operator [](size_t i);
148 :
149 : private:
150 : friend class JsonValue;
151 : friend class JsonObject;
152 : friend class JsonDocument;
153 :
154 : void detach();
155 : std::shared_ptr<JsonData> m_data;
156 : };
157 :
158 : class JsonObject
159 : {
160 : public:
161 : JsonObject(std::shared_ptr<JsonData> d = nullptr);
162 :
163 : bool isValid() const;
164 :
165 : bool empty() const;
166 : size_t size() const;
167 : std::vector<std::string> keys() const;
168 : bool contains(const std::string& key) const;
169 : JsonValue value(const std::string& key, JsonValue def = JsonValue()) const;
170 :
171 : JsonObject& set(const std::string& key, bool v);
172 : JsonObject& set(const std::string& key, int v);
173 : JsonObject& set(const std::string& key, double v);
174 : JsonObject& set(const std::string& key, const String& str);
175 : JsonObject& set(const std::string& key, const std::string& str);
176 : JsonObject& set(const std::string& key, const char* str);
177 : JsonObject& set(const std::string& key, const JsonValue& v);
178 : JsonObject& set(const std::string& key, const JsonArray& v);
179 : JsonObject& set(const std::string& key, const JsonObject& v);
180 :
181 : JsonValue operator [](const std::string& key) const;
182 : JsonValueRef operator [](const std::string& key);
183 :
184 : private:
185 : friend class JsonValue;
186 : friend class JsonArray;
187 : friend class JsonDocument;
188 :
189 : void detach();
190 : std::shared_ptr<JsonData> m_data;
191 : };
192 :
193 : class JsonDocument
194 : {
195 : public:
196 : JsonDocument(std::shared_ptr<JsonData> d = nullptr);
197 : JsonDocument(JsonObject o);
198 : JsonDocument(JsonArray a);
199 :
200 : enum class Format {
201 : Indented,
202 : Compact
203 : };
204 :
205 : bool isObject() const;
206 : bool isArray() const;
207 : JsonObject rootObject() const;
208 : JsonArray rootArray() const;
209 :
210 : ByteArray toJson(Format format = Format::Indented) const;
211 : static JsonDocument fromJson(const ByteArray& ba, std::string* err = nullptr);
212 :
213 : private:
214 : std::shared_ptr<JsonData> m_data;
215 : };
216 : }
217 :
218 : #endif // MUSE_GLOBAL_JSON_H
|