Pioneer
Loading...
Searching...
No Matches
JsonUtils.h
Go to the documentation of this file.
1// Copyright © 2008-2024 Pioneer Developers. See AUTHORS.txt for details
2// Licensed under the terms of the GPL v3. See licenses/GPL-3.txt
3
4#ifndef _JSON_UTILS_H
5#define _JSON_UTILS_H
6
7// This file pulls in a fair number of includes, including the complete json library.
8// If possible, avoid #including this file in other headers; use JsonFwd.h and include
9// this in your .cpp file instead.
10
11#include "Color.h"
12#include "FrameId.h"
13#include "Json.h"
14#include "Quaternion.h"
15#include "RefCounted.h"
16#include "fixed.h"
17#include "matrix3x3.h"
18#include "matrix4x4.h"
19#include "vector3.h"
20
21namespace FileSystem {
22 class FileSource;
23 class FileData;
24} // namespace FileSystem
25
26namespace JsonUtils {
27 // Low-level load JSON from a file descriptor.
29 // Load a JSON file from a path and a file source.
30 Json LoadJsonFile(const std::string &filename, FileSystem::FileSource &source);
31 // Load a JSON file from the game's data sources, optionally applying all
32 // files with the the name <filename>.patch as Json Merge Patch (RFC 7386) files
33 Json LoadJsonDataFile(const std::string &filename, bool with_merge = true);
34 // Loads an optionally-gzipped, optionally-CBOR encoded JSON file from the specified source.
35 Json LoadJsonSaveFile(const std::string &filename, FileSystem::FileSource &source);
36 // Patches a Json object with an extended Merge-Patch object
37 bool ApplyJsonPatch(Json &inObject, const Json &patch, const std::string &filename);
38} // namespace JsonUtils
39
40// To-JSON functions. These are called explicitly, and are passed a reference to the object to fill.
41void VectorToJson(Json &jsonObj, const vector2f &vec);
42void VectorToJson(Json &jsonObj, const vector2d &vec);
43void VectorToJson(Json &jsonObj, const vector3f &vec);
44void VectorToJson(Json &jsonObj, const vector3d &vec);
45void QuaternionToJson(Json &jsonObj, const Quaternionf &quat);
46void QuaternionToJson(Json &jsonObj, const Quaterniond &quat);
47void MatrixToJson(Json &jsonObj, const matrix3x3f &mat);
48void MatrixToJson(Json &jsonObj, const matrix3x3d &mat);
49void MatrixToJson(Json &jsonObj, const matrix4x4f &mat);
50void MatrixToJson(Json &jsonObj, const matrix4x4d &mat);
51void ColorToJson(Json &jsonObj, const Color3ub &col);
52void ColorToJson(Json &jsonObj, const Color4ub &col);
53void BinStrToJson(Json &jsonObj, const std::string &str);
54
55// Drivers for automatic serialization of custom types. These are implicitly called by assigning to a Json object.
56template <typename T>
57void to_json(Json &obj, const vector2<T> &vec) { VectorToJson(obj, vec); }
58template <typename T>
59void to_json(Json &obj, const vector3<T> &vec) { VectorToJson(obj, vec); }
60template <typename T>
61void to_json(Json &obj, const Quaternion<T> &vec) { QuaternionToJson(obj, vec); }
62template <typename T>
63void to_json(Json &obj, const matrix3x3<T> &mat) { MatrixToJson(obj, mat); }
64template <typename T>
65void to_json(Json &obj, const matrix4x4<T> &mat) { MatrixToJson(obj, mat); }
66inline void to_json(Json &obj, const Color3ub &col) { ColorToJson(obj, col); }
67inline void to_json(Json &obj, const Color4ub &col) { ColorToJson(obj, col); }
68inline void to_json(Json &obj, const FrameId &t) { obj = t.id(); }
69
70void from_json(const Json &obj, fixed &n);
71void to_json(Json &obj, const fixed &n);
72
73// Parse JSON functions. These functions will throw Json::type_error if passed an invalid type.
74void JsonToVector(vector2f *vec, const Json &jsonObj);
75void JsonToVector(vector2d *vec, const Json &jsonObj);
76void JsonToVector(vector3f *vec, const Json &jsonObj);
77void JsonToVector(vector3d *vec, const Json &jsonObj);
78void JsonToQuaternion(Quaternionf *pQuat, const Json &jsonObj);
79void JsonToQuaternion(Quaterniond *pQuat, const Json &jsonObj);
80void JsonToMatrix(matrix3x3f *pMat, const Json &jsonObj);
81void JsonToMatrix(matrix3x3d *pMat, const Json &jsonObj);
82void JsonToMatrix(matrix4x4f *pMat, const Json &jsonObj);
83void JsonToMatrix(matrix4x4d *pMat, const Json &jsonObj);
84void JsonToColor(Color3ub *pCol, const Json &jsonObj);
85void JsonToColor(Color4ub *pCol, const Json &jsonObj);
86std::string JsonToBinStr(const Json &jsonObj);
87
88template <typename T>
89void from_json(const Json &obj, vector2<T> &vec) { JsonToVector(&vec, obj); }
90template <typename T>
91void from_json(const Json &obj, vector3<T> &vec) { JsonToVector(&vec, obj); }
92template <typename T>
93void from_json(const Json &obj, Quaternion<T> &vec) { JsonToQuaternion(&vec, obj); }
94template <typename T>
95void from_json(const Json &obj, matrix3x3<T> &vec) { JsonToMatrix(&vec, obj); }
96template <typename T>
97void from_json(const Json &obj, matrix4x4<T> &vec) { JsonToMatrix(&vec, obj); }
98inline void from_json(const Json &obj, Color3ub &col) { JsonToColor(&col, obj); }
99inline void from_json(const Json &obj, Color4ub &col) { JsonToColor(&col, obj); }
100inline void from_json(const Json &obj, FrameId &id) { id = (int)obj; }
101
102// String formatting utils
103// TODO: nlohmann::json can round-trip doubles to and from json with no precision loss
104// should we keep munging doubles to string?
105
106void Vector3fToStr(const vector3f &val, char *out, size_t size);
107void Vector3dToStr(const vector3d &val, char *out, size_t size);
108void Matrix3x3fToStr(const matrix3x3f &val, char *out, size_t size);
109void Matrix3x3dToStr(const matrix3x3d &val, char *out, size_t size);
110void Matrix4x4fToStr(const matrix4x4f &val, char *out, size_t size);
111void Matrix4x4dToStr(const matrix4x4d &val, char *out, size_t size);
112
113void StrToVector3f(const char *str, vector3f &val);
114void StrToVector3d(const char *str, vector3d &val);
115void StrToMatrix3x3f(const char *str, matrix3x3f &val);
116void StrToMatrix3x3d(const char *str, matrix3x3d &val);
117void StrToMatrix4x4f(const char *str, matrix4x4f &val);
118void StrToMatrix4x4d(const char *str, matrix4x4d &val);
119
120#endif /* _JSON_UTILS_H */
void JsonToMatrix(matrix3x3f *pMat, const Json &jsonObj)
Definition: JsonUtils.cpp:397
void MatrixToJson(Json &jsonObj, const matrix3x3f &mat)
Definition: JsonUtils.cpp:192
void Vector3fToStr(const vector3f &val, char *out, size_t size)
Definition: JsonUtils.cpp:603
void JsonToVector(vector2f *vec, const Json &jsonObj)
Definition: JsonUtils.cpp:323
void Vector3dToStr(const vector3d &val, char *out, size_t size)
Definition: JsonUtils.cpp:621
std::string JsonToBinStr(const Json &jsonObj)
Definition: JsonUtils.cpp:522
void Matrix4x4fToStr(const matrix4x4f &val, char *out, size_t size)
Definition: JsonUtils.cpp:687
void VectorToJson(Json &jsonObj, const vector2f &vec)
Definition: JsonUtils.cpp:131
void Matrix3x3dToStr(const matrix3x3d &val, char *out, size_t size)
Definition: JsonUtils.cpp:663
void QuaternionToJson(Json &jsonObj, const Quaternionf &quat)
Definition: JsonUtils.cpp:174
void StrToVector3f(const char *str, vector3f &val)
Definition: JsonUtils.cpp:739
void ColorToJson(Json &jsonObj, const Color3ub &col)
Definition: JsonUtils.cpp:282
void Matrix4x4dToStr(const matrix4x4d &val, char *out, size_t size)
Definition: JsonUtils.cpp:713
void Matrix3x3fToStr(const matrix3x3f &val, char *out, size_t size)
Definition: JsonUtils.cpp:639
void JsonToColor(Color3ub *pCol, const Json &jsonObj)
Definition: JsonUtils.cpp:503
void StrToMatrix3x3f(const char *str, matrix3x3f &val)
Definition: JsonUtils.cpp:775
void StrToMatrix4x4d(const char *str, matrix4x4d &val)
Definition: JsonUtils.cpp:835
void BinStrToJson(Json &jsonObj, const std::string &str)
Definition: JsonUtils.cpp:301
void StrToMatrix4x4f(const char *str, matrix4x4f &val)
Definition: JsonUtils.cpp:815
void from_json(const Json &obj, fixed &n)
Definition: JsonUtils.cpp:548
void StrToMatrix3x3d(const char *str, matrix3x3d &val)
Definition: JsonUtils.cpp:795
void JsonToQuaternion(Quaternionf *pQuat, const Json &jsonObj)
Definition: JsonUtils.cpp:369
void to_json(Json &obj, const vector2< T > &vec)
Definition: JsonUtils.h:57
void StrToVector3d(const char *str, vector3d &val)
Definition: JsonUtils.cpp:757
nlohmann::json Json
Definition: Json.h:8
double val
Definition: PrecalcPath.cpp:40
Definition: FileSystem.h:249
Definition: RefCounted.h:36
Definition: CityOnPlanet.h:28
Definition: JsonUtils.cpp:45
bool ApplyJsonPatch(Json &inObject, const Json &patchObject, const std::string &filename)
Definition: JsonUtils.cpp:109
Json LoadJsonDataFile(const std::string &filename, bool with_merge)
Definition: JsonUtils.cpp:67
Json LoadJsonSaveFile(const std::string &filename, FileSystem::FileSource &source)
Definition: JsonUtils.cpp:79
Json LoadJsonFile(const std::string &filename, FileSystem::FileSource &source)
Definition: JsonUtils.cpp:62
Json LoadJson(RefCountedPtr< FileSystem::FileData > fd)
Definition: JsonUtils.cpp:46
Definition: Color.h:167
Definition: Color.h:66
Definition: LuaFileSystem.cpp:34
Definition: FrameId.h:9
constexpr size_t id() const
Definition: FrameId.h:23