#pragma once #include #include #include #include #include #include namespace Tesses::Framework::Serialization::Json { class JArray; class JObject; class JUndefined { public: }; using JToken = std::variant; class JOItem; class JArray { std::vector items; public: JArray(); JArray(std::initializer_list items); std::vector& GetVector(); void Add(JToken item); void RemoveAt(size_t index); size_t Count(); void SetAt(size_t index, JToken item); JToken GetAt(size_t index); void Clear(); std::vector::iterator begin(); std::vector::iterator end(); }; class JObject { std::map map; public: JObject(); JObject(std::initializer_list items); void SetValue(std::string key, JToken item); template bool TryGetValueAsType(std::string key, T& value) { auto obj = GetValue(key); if(std::holds_alternative(obj)) { value = std::get(obj); return true; } return false; } JToken GetValue(std::string key); void Remove(std::string key); std::map& GetMap(); std::map::iterator begin(); std::map::iterator end(); }; template bool TryGetJToken(JToken json, T& item) { if(std::holds_alternative(json)) { item = std::get(json); return true; } return false; } class JOItem { public: JOItem(); JOItem(std::string key, JToken value); std::string key; JToken value; }; class Json { static std::string tab(std::string str); public: static JToken Decode(std::string str); static std::string Encode(JToken tkn, bool indent=true); }; }