1// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd.
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5#include "basicjsonstructures.h"
6
7#include <QJsonDocument>
8#include <QJsonObject>
9
10namespace newlsp{
11
12const QString K_ID {"id"};
13const QString K_JSON_RPC {"jsonrpc"};
14const QString V_2_0 {"2.0"};
15const QString K_METHOD {"method"};
16const QString K_RESULT {"result"};
17const QString K_PARAMS {"params"};
18const QString H_CONTENT_LENGTH {"Content-Length"};
19const QString H_CONTENT_TYPE {"Content-Type"};
20const QString H_CHARSET {"charset"};
21const QString RK_CONTENT_LENGTH {"ContentLength"};
22const QString RK_CONTENT_TYPE {"ContentType"};
23const QString RK_CHARSET {"charset"};
24
25std::string toJsonValueStr(unsigned int value)
26{
27 return std::to_string(value);
28}
29
30std::string toJsonValueStr(int value)
31{
32 return std::to_string(value);
33}
34
35std::string toJsonValueStr(bool value)
36{
37 if (true == value)
38 return "true";
39 if (false == value)
40 return "false";
41 return "false";
42}
43
44std::string toJsonValueStr(float value)
45{
46 return std::to_string(value);
47}
48
49std::string toJsonValueStr(double value)
50{
51 return std::to_string(value);
52}
53
54std::string toJsonValueStr(const std::string &value)
55{
56 return "\"" + value + "\"";
57}
58
59std::string toJsonValueStr(const std::vector<int> &vecInt)
60{
61 std::string ret;
62 if (vecInt.size() < 0)
63 return ret;
64
65 ret += "[";
66 int vecSize = vecInt.size();
67 for (int i = 0; i < vecSize; i++) {
68 ret += toJsonValueStr(vecInt[i]);
69 if (i < vecSize - 1)
70 ret += ",";
71 }
72 ret += "]";
73
74 return ret;
75}
76
77std::string toJsonValueStr(const std::vector<std::string> &vecString)
78{
79 std::string ret;
80 if (vecString.size() < 0)
81 return ret;
82
83 ret += "[";
84 int vecSize = vecString.size();
85 for (int i = 0; i < vecSize; i++) {
86 ret += toJsonValueStr(vecString[i]);
87 if (i < vecSize - 1)
88 ret += ",";
89 }
90 ret += "]";
91
92 return ret;
93}
94
95std::string json::addScope(const std::string &src)
96{
97 return "{" + src + "}";
98}
99
100std::string json::delScope(const std::string &obj)
101{
102 std::string ret = obj;
103 ret.erase(0, 1);
104 ret.erase(ret.size() - 1, ret.size());
105 return ret;
106}
107
108std::string json::formatKey(const std::string &key)
109{
110 return "\"" + key + "\"";
111}
112
113std::string toJsonValueStr(const ProgressToken &val)
114{
115 if (any_contrast<int>(val))
116 return toJsonValueStr(std::any_cast<int>(val));
117 else if (any_contrast<std::string>(val))
118 return toJsonValueStr(std::any_cast<std::string>(val));
119 return "{}";
120}
121
122std::string toJsonValueStr(const TextDocumentItem &val)
123{
124 std::string ret;
125 ret = json::addValue(ret, json::KV{"uri", val.uri});
126 ret = json::addValue(ret, json::KV{"languageId", val.languageId});
127 ret = json::addValue(ret, json::KV{"version", val.version});
128 ret = json::addValue(ret, json::KV{"text", val.text});
129 return json::addScope(ret);
130}
131
132std::string toJsonValueStr(const VersionedTextDocumentIdentifier &val)
133{
134 std::string ret = json::delScope(toJsonValueStr(TextDocumentIdentifier(val)));
135 ret = json::addValue(ret, json::KV{"version", val.version});
136 return json::addScope(ret);
137}
138
139std::string toJsonValueStr(const TextDocumentIdentifier &val)
140{
141 std::string ret;
142 ret = json::addValue(ret, json::KV{"uri", val.uri});
143 return json::addScope(ret);
144}
145
146std::string toJsonValueStr(const OptionalVersionedTextDocumentIdentifier &val)
147{
148 std::string ret = json::delScope(toJsonValueStr(TextDocumentIdentifier(val)));
149 ret = json::addValue(ret, json::KV{"version", val.version});
150 return json::addScope(ret);
151}
152
153std::string toJsonValueStr(const Range &val)
154{
155 std::string ret;
156 ret = json::addValue(ret, json::KV{"start", val.start});
157 ret = json::addValue(ret, json::KV{"end", val.end});
158 return json::addScope(ret);
159}
160
161std::string toJsonValueStr(const Position &val)
162{
163 std::string ret;
164 ret = json::addValue(ret, json::KV{"line", val.line});
165 ret = json::addValue(ret, json::KV{"character", val.character});
166 return json::addScope(ret);
167}
168
169std::string toJsonValueStr(const DocumentFilter &val)
170{
171 std::string ret;
172 ret = json::addValue(ret, json::KV{"language", val.language});
173 ret = json::addValue(ret, json::KV{"scheme", val.scheme});
174 ret = json::addValue(ret, json::KV{"pattern", val.pattern});
175 return json::addScope(ret);
176}
177
178std::string toJsonValueStr(const DocumentSelector &val)
179{
180 std::string ret;
181 int size = val.size();
182 if (size < 0)
183 return ret;
184
185 ret += "[";
186 for (int i = 0; i < size; i++) {
187 ret += toJsonValueStr(val[i]);
188 if (i < size - 1)
189 ret += ",";
190 }
191 ret += "]";
192 return ret;
193}
194
195std::string toJsonValueStr(const WorkDoneProgressOptions &val)
196{
197 std::string ret;
198 ret = json::addValue(ret, json::KV{"workDoneProgress", val.workDoneProgress});
199 return json::addScope(ret);
200}
201
202std::string toJsonValueStr(const WorkDoneProgressParams &params)
203{
204 std::string ret;
205 if (params.workDoneToken) {
206 if (any_contrast<bool>(params.workDoneToken)) {
207 bool tv = std::any_cast<bool>(params.workDoneToken);
208 ret = json::addValue(ret, json::KV{"workDoneToken", tv});
209 } else if (any_contrast<std::string>(params.workDoneToken)) {
210 std::string tv = std::any_cast<std::string>(params.workDoneToken);
211 ret = json::addValue(ret, json::KV{"workDoneToken", tv});
212 }
213 }
214 return json::addScope(ret);
215}
216
217std::string toJsonValueStr(const TextDocumentPositionParams &val)
218{
219 std::string ret;
220 ret = json::addValue(ret, json::KV{"textDocument", val.textDocument});
221 ret = json::addValue(ret, json::KV{"position", val.position});
222 return json::addScope(ret);
223}
224
225std::string json::mergeObjs(const std::vector<std::string> &objs)
226{
227 std::string ret;
228 auto itera = objs.begin();
229 while (itera != objs.end()) {
230 if (!ret.empty())
231 ret += ",";
232 ret += json::delScope(*itera);
233 itera ++;
234 }
235 return json::addScope(ret);
236}
237
238std::string toJsonValueStr(const PartialResultParams &params)
239{
240 std::string ret;
241 ret = json::addValue(ret, json::KV{"partialResultToken", params.partialResultToken});
242 return json::addScope(ret);
243}
244
245std::string toJsonValueStr(const Command &val)
246{
247 std::string ret;
248 ret = json::addValue(ret, json::KV{"title", val.title});
249 ret = json::addValue(ret, json::KV{"command", val.command});
250 ret = json::addValue(ret, json::KV{"arguments", val.arguments});
251 return json::addScope(ret);
252}
253
254std::string toJsonValueStr(const Diagnostic &val)
255{
256 std::string ret;
257 if (any_contrast<int>(val.code))
258 ret = json::addValue(ret, json::KV{"title", std::any_cast<int>(val.code)});
259 else if (any_contrast<std::string>(val.code))
260 ret = json::addValue(ret, json::KV{"title", std::any_cast<std::string>(val.code)});
261 ret = json::addValue(ret, json::KV{"data", val.data});
262 ret = json::addValue(ret, json::KV{"tags", val.tags});
263 ret = json::addValue(ret, json::KV{"range", val.range});
264 ret = json::addValue(ret, json::KV{"source", val.source});
265 ret = json::addValue(ret, json::KV{"message", val.message});
266 ret = json::addValue(ret, json::KV{"severity", val.severity});
267 ret = json::addValue(ret, json::KV{"codeDescription", val.codeDescription});
268 ret = json::addValue(ret, json::KV{"relatedInformation", val.relatedInformation});
269 return json::addScope(ret);
270}
271
272std::string toJsonValueStr(const CodeDescription &val)
273{
274 std::string ret;
275 ret = json::addValue(ret, json::KV{"href", val.href});
276 return json::addScope(ret);
277}
278
279std::string toJsonValueStr(const DiagnosticRelatedInformation &val)
280{
281 std::string ret;
282 ret = json::addValue(ret, json::KV{"message", val.message});
283 ret = json::addValue(ret, json::KV{"location", val.location});
284 return json::addScope(ret);
285}
286
287std::string toJsonValueStr(const Location &val)
288{
289 std::string ret;
290 ret = json::addValue(ret, json::KV{"uri", val.uri});
291 ret = json::addValue(ret, json::KV{"range", val.range});
292 return json::addScope(ret);
293}
294
295std::string toJsonValueStr(const WorkspaceEdit &val)
296{
297 std::string ret;
298 ret = json::addValue(ret, json::KV{"changes", val.changes});
299 ret = json::addValue(ret, json::KV{"documentChanges", val.documentChanges});
300 ret = json::addValue(ret, json::KV{"changeAnnotations", val.changeAnnotations});
301 return json::addScope(ret);
302}
303
304std::string toJsonValueStr(const WorkspaceEdit::Changes &val)
305{
306 std::string ret;
307 for (auto &&one : val) {
308 ret = json::addValue(ret, json::KV{one.first, one.second});
309 }
310 return json::addScope(ret);
311}
312
313std::string toJsonValueStr(const WorkspaceEdit::ChangeAnnotations &val)
314{
315 std::string ret;
316 for (auto &&one : val) {
317 ret = json::addValue(ret, json::KV{one.first, one.second});
318 }
319 return json::addScope(ret);
320}
321
322std::string toJsonValueStr(const ChangeAnnotation &val)
323{
324 std::string ret;
325 ret = json::addValue(ret, json::KV{"label", val.label});
326 ret = json::addValue(ret, json::KV{"description", val.description});
327 ret = json::addValue(ret, json::KV{"needsConfirmation", val.needsConfirmation});
328 return json::addScope(ret);
329}
330
331std::string toJsonValueStr(const DeleteFile &val)
332{
333 std::string ret;
334 ret = json::addValue(ret, json::KV{"kind", val.kind});
335 ret = json::addValue(ret, json::KV{"uri", val.uri});
336 ret = json::addValue(ret, json::KV{"options", val.options});
337 ret = json::addValue(ret, json::KV{"annotationId", val.annotationId});
338 return json::addScope(ret);
339}
340
341std::string toJsonValueStr(const DeleteFileOptions &val)
342{
343 std::string ret;
344 ret = json::addValue(ret, json::KV{"recursive", val.recursive});
345 ret = json::addValue(ret, json::KV{"ignoreIfNotExists", val.ignoreIfNotExists});
346 return json::addScope(ret);
347}
348
349std::string toJsonValueStr(const RenameFile &val)
350{
351 std::string ret;
352 ret = json::addValue(ret, json::KV{"kind", val.kind});
353 ret = json::addValue(ret, json::KV{"oldUri", val.oldUri});
354 ret = json::addValue(ret, json::KV{"newUri", val.newUri});
355 ret = json::addValue(ret, json::KV{"options", val.options});
356 ret = json::addValue(ret, json::KV{"annotationId", val.annotationId});
357 return json::addScope(ret);
358}
359
360std::string toJsonValueStr(const RenameFileOptions &val)
361{
362 std::string ret;
363 ret = json::addValue(ret, json::KV{"overwrite", val.overwrite});
364 ret = json::addValue(ret, json::KV{"ignoreIfExists", val.ignoreIfExists});
365 return json::addScope(ret);
366}
367
368std::string toJsonValueStr(const CreateFile &val)
369{
370 std::string ret;
371 ret = json::addValue(ret, json::KV{"kind", val.kind});
372 ret = json::addValue(ret, json::KV{"uri", val.uri});
373 ret = json::addValue(ret, json::KV{"options", val.options});
374 ret = json::addValue(ret, json::KV{"annotationId", val.annotationId});
375 return json::addScope(ret);
376}
377
378std::string toJsonValueStr(const CreateFileOptions &val)
379{
380 std::string ret;
381 ret = json::addValue(ret, json::KV{"overwrite", val.overwrite});
382 ret = json::addValue(ret, json::KV{"ignoreIfExists", val.ignoreIfExists});
383 return json::addScope(ret);
384}
385
386std::string toJsonValueStr(const TextDocumentEdit &val)
387{
388 std::string ret;
389 ret = json::addValue(ret, json::KV{"textDocument", val.textDocument});
390 ret = json::addValue(ret, json::KV{"edits", val.edits});
391 return json::addScope(ret);
392}
393
394std::string toJsonValueStr(const AnnotatedTextEdit &val)
395{
396 std::string ret;
397 ret = json::addValue(ret, json::KV{"annotationId", val.annotationId});
398 return json::addScope(ret);
399}
400
401std::string toJsonValueStr(const TextEdit &val)
402{
403 std::string ret;
404 ret = json::addValue(ret, json::KV{"range", val.range});
405 ret = json::addValue(ret, json::KV{"newText", val.newText});
406 return json::addScope(ret);
407}
408
409std::string toJsonValueStr(const WorkspaceEdit::DocumentChanges &val)
410{
411 std::string ret;
412 if (any_contrast<std::vector<TextDocumentEdit>>(val))
413 ret = toJsonValueStr(std::any_cast<std::vector<TextDocumentEdit>>(val));
414 else if (any_contrast<std::vector<CreateFile>>(val))
415 ret = toJsonValueStr(std::any_cast<CreateFile>(val));
416 else if (any_contrast<std::vector<RenameFile>>(val))
417 ret = toJsonValueStr(std::any_cast<RenameFile>(val));
418 else if (any_contrast<std::vector<DeleteFile>>(val))
419 ret = toJsonValueStr(std::any_cast<std::vector<DeleteFile>>(val));
420 return ret;
421}
422
423std::string toJsonValueStr(const TextDocumentEdit::Edits &val)
424{
425 std::string ret;
426 if (!std::vector<AnnotatedTextEdit>(val).empty()) {
427 auto textEdit = std::vector<AnnotatedTextEdit>(val);
428 int size = textEdit.size();
429 if (size < 0)
430 return ret;
431
432 ret += "[";
433 for (int i = 0; i < size; i++) {
434 ret += toJsonValueStr(textEdit[i]);
435 if (i < size - 1)
436 ret += ",";
437 }
438 ret += "]";
439 return ret;
440 }
441 else if (!std::vector<TextEdit>(val).empty()) {
442 auto textEdit = std::vector<TextEdit>(val);
443 int size = textEdit.size();
444 if (size < 0)
445 return ret;
446
447 ret += "[";
448 for (int i = 0; i < size; i++) {
449 ret += toJsonValueStr(textEdit[i]);
450 if (i < size - 1)
451 ret += ",";
452 }
453 ret += "]";
454 return ret;
455 }
456 return json::addScope(ret);
457}
458
459QString methodData(int id, const QString &method, const QJsonObject &params)
460{
461 QJsonObject retObj;
462 retObj[K_JSON_RPC] = V_2_0;
463 retObj[K_PARAMS] = params;
464 retObj[K_ID] = id;
465 retObj[K_METHOD] = method;
466 QJsonDocument jsonDoc(retObj);
467 QString jsonStr = jsonDoc.toJson(QJsonDocument::JsonFormat::Compact);
468 return H_CONTENT_LENGTH + QString(": %0\r\n\r\n").arg(jsonStr.length()) + jsonStr + "\n";
469}
470
471QString notificationData(const QString &method, const QJsonObject &params)
472{
473 QJsonObject retObj;
474 retObj[K_JSON_RPC] = V_2_0;
475 retObj[K_PARAMS] = params;
476 retObj[K_METHOD] = method;
477 QJsonDocument jsonDoc(retObj);
478 QString jsonStr = jsonDoc.toJson(QJsonDocument::JsonFormat::Compact);
479 return H_CONTENT_LENGTH + QString(": %0\r\n\r\n").arg(jsonStr.length()) + jsonStr + "\n";
480}
481
482} // namespace newlsp
483