1 // =================================
  2 // Copyright (c) 2021 Seppo Laakko
  3 // Distributed under the MIT license
  4 // =================================
  5 
  6 using System;
  7 using System.Collections;
  8 
  9 namespace System.Json
 10 {
 11     public concept JsonExportable<T>
 12     {
 13         UniquePtr<JsonValue> T.ToJson();
 14     }
 15 
 16     public UniquePtr<JsonValue> ToJson<T>(const T& object)
 17         where T is JsonExportable
 18     {
 19         return object.ToJson();
 20     }
 21     
 22     public UniquePtr<JsonValue> ToJson<T>(const UniquePtr<T>& ptr)
 23         where T is JsonExportable
 24     {
 25         if (ptr.IsNull())
 26         {
 27             return UniquePtr<JsonValue>(new JsonNull());
 28         }
 29         else
 30         {
 31             T* p = ptr.Get();
 32             UniquePtr<JsonObject> object = new JsonObject();
 33             object->AddField("class"UniquePtr<JsonValue>(new JsonString(ToUtf32(typename(*p)))));
 34             object->AddField("object"p->ToJson());
 35             return UniquePtr<JsonValue>(object.Release());
 36         }
 37     }
 38 
 39     public UniquePtr<JsonValue> ToJson<T>(const SharedPtr<T>& ptr)
 40         where T is JsonExportable
 41     {
 42         if (ptr.IsNull())
 43         {
 44             return UniquePtr<JsonValue>(new JsonNull());
 45         }
 46         else
 47         {
 48             T* p = ptr.Get();
 49             UniquePtr<JsonObject> object = new JsonObject();
 50             object->AddField("class"UniquePtr<JsonValue>(new JsonString(ToUtf32(typename(*p)))));
 51             object->AddField("object"p->ToJson());
 52             return UniquePtr<JsonValue>(object.Release());
 53         }
 54     }
 55     
 56     public nothrow UniquePtr<JsonValue> ToJson(double value)
 57     {
 58         return UniquePtr<JsonValue>(new JsonNumber(value));
 59     }
 60     
 61     public nothrow UniquePtr<JsonValue> ToJson(bool value)
 62     {
 63         return UniquePtr<JsonValue>(new JsonBool(value));
 64     }
 65     
 66     public nothrow UniquePtr<JsonValue> ToJson<T>(T value)
 67         where System.Meta.IsEnumeratedType<T>()
 68     {
 69         return UniquePtr<JsonValue>(new JsonNumber(cast<double>(cast<T.UnderlyingType>(value))));
 70     }
 71 
 72     public UniquePtr<JsonValue> ToJson(const string& value)
 73     {
 74         return UniquePtr<JsonValue>(new JsonString(ToUtf32(value)));
 75     }
 76     
 77     public UniquePtr<JsonValue> ToJson(const wstring& value)
 78     {
 79         return UniquePtr<JsonValue>(new JsonString(ToUtf32(value)));
 80     }
 81     
 82     public nothrow UniquePtr<JsonValue> ToJson(const ustring& value)
 83     {
 84         return UniquePtr<JsonValue>(new JsonString(value));
 85     }
 86     
 87     public nothrow UniquePtr<JsonValue> ToJson(const Date& value)
 88     {
 89         return UniquePtr<JsonValue>(new JsonString(ToUtf32(value.ToString())));
 90     }
 91     
 92     public nothrow UniquePtr<JsonValue> ToJson(const DateTime& value)
 93     {
 94         return UniquePtr<JsonValue>(new JsonString(ToUtf32(value.ToString())));
 95     }
 96     
 97     public nothrow UniquePtr<JsonValue> ToJson(const Timestamp& value)
 98     {
 99         return UniquePtr<JsonValue>(new JsonString(ToUtf32(value.ToString())));
100     }
101 
102     public nothrow UniquePtr<JsonValue> ToJson(const Uuid& value)
103     {
104         return UniquePtr<JsonValue>(new JsonString(ToUtf32(ToString(value))));
105     }
106 
107     public UniquePtr<JsonValue> ToJson<T>(const List<T>& value)
108     {
109         UniquePtr<JsonArray> array = new JsonArray();
110         for (const T& item : value)
111         {
112             array->AddItem(ToJson(item));
113         }
114         return UniquePtr<JsonValue>(array.Release());
115     }
116 
117     public UniquePtr<JsonValue> ToJson<T>(const Queue<T>& value)
118     {
119         UniquePtr<JsonArray> array = new JsonArray();
120         for (const T& item : value.Rep())
121         {
122             array->AddItem(ToJson(item));
123         }
124         return UniquePtr<JsonValue>(array.Release());
125     }
126     
127     public UniquePtr<JsonValue> ToJson<KeyValueKeyCompare>(const Map<KeyValueKeyCompare>& value) where Key is ustring
128     {
129         UniquePtr<JsonObject> object = new JsonObject();
130         for (const Pair<KeyValue>& p : value)
131         {
132             object->AddField(p.firstToJson(p.second));
133         }
134         return UniquePtr<JsonValue>(object.Release());
135     }
136 
137     public UniquePtr<JsonValue> ToJson<KeyValueKeyCompare>(const Map<KeyValueKeyCompare>& value) where Key is wstring or Key is string
138     {
139         UniquePtr<JsonObject> object = new JsonObject();
140         for (const Pair<KeyValue>& p : value)
141         {
142             object->AddField(ToUtf32(p.first)ToJson(p.second));
143         }
144         return UniquePtr<JsonValue>(object.Release());
145     }
146 
147     public UniquePtr<JsonValue> ToJson<KTHC>(const HashMap<KTHC>& value) where K is ustring
148     {
149         UniquePtr<JsonObject> object = new JsonObject();
150         for (const Pair<KT>& p : value)
151         {
152             object->AddField(p.firstToJson(p.second));
153         }
154         return UniquePtr<JsonValue>(object.Release());
155     }
156         
157     public UniquePtr<JsonValue> ToJson<KTHC>(const HashMap<KTHC>& value) where K is wstring or K is string
158     {
159         UniquePtr<JsonObject> object = new JsonObject();
160         for (const Pair<KT>& p : value)
161         {
162             object->AddField(ToUtf32(p.first)ToJson(p.second));
163         }
164         return UniquePtr<JsonValue>(object.Release());
165     }
166 }