@@ -8,14 +8,16 @@ import "package:curie/curie.dart";
88import "package:meta/meta.dart" ;
99
1010import "extensions/json_parser.dart" ;
11+ import "extensions/json_serializer.dart" ;
12+ import "extensions/serializable.dart" ;
1113
1214/// Metadata that describes the data format used. It can be used for validation.
1315///
1416/// See W3C WoT Thing Description specification, [section 5.3.2.1][spec link] .
1517///
1618/// [spec link] : https://w3c.github.io/wot-thing-description/#dataschema
1719@immutable
18- class DataSchema {
20+ class DataSchema implements Serializable {
1921 /// Constructor
2022 const DataSchema ({
2123 this .atType,
@@ -47,8 +49,7 @@ class DataSchema {
4749 this .pattern,
4850 this .contentEncoding,
4951 this .contentMediaType,
50- this .rawJson,
51- this .additionalFields,
52+ this .additionalFields = const {},
5253 });
5354
5455 // TODO: Consider creating separate classes for each data type.
@@ -83,7 +84,7 @@ class DataSchema {
8384 final minimum = json.parseField <num >("minimum" , parsedFields);
8485 final exclusiveMinimum =
8586 json.parseField <num >("exclusiveMinimum" , parsedFields);
86- final maximum = json.parseField <num >("minimum " , parsedFields);
87+ final maximum = json.parseField <num >("maximum " , parsedFields);
8788 final exclusiveMaximum =
8889 json.parseField <num >("exclusiveMaximum" , parsedFields);
8990 final multipleOf = json.parseField <num >("multipleOf" , parsedFields);
@@ -136,7 +137,6 @@ class DataSchema {
136137 contentMediaType: contentMediaType,
137138 oneOf: oneOf,
138139 properties: properties,
139- rawJson: json,
140140 additionalFields: additionalFields,
141141 );
142142 }
@@ -274,8 +274,63 @@ class DataSchema {
274274 final String ? contentMediaType;
275275
276276 /// Additional fields that could not be deserialized as class members.
277- final Map <String , dynamic >? additionalFields;
278-
279- /// The original JSON object that was parsed when creating this [DataSchema] .
280- final Map <String , dynamic >? rawJson;
277+ final Map <String , dynamic > additionalFields;
278+
279+ @override
280+ Map <String , dynamic > toJson () {
281+ final result = {
282+ ...additionalFields,
283+ };
284+
285+ final keyValuePairs = [
286+ ("@type" , atType),
287+ ("title" , title),
288+ ("titles" , titles),
289+ ("description" , description),
290+ ("descriptions" , descriptions),
291+ ("const" , constant),
292+ ("default" , defaultValue),
293+ ("enum" , enumeration),
294+ ("readOnly" , readOnly),
295+ ("writeOnly" , writeOnly),
296+ ("format" , format),
297+ ("unit" , unit),
298+ ("type" , type),
299+ ("minimum" , minimum),
300+ ("exclusiveMinimum" , exclusiveMinimum),
301+ ("maximum" , maximum),
302+ ("exclusiveMaximum" , exclusiveMaximum),
303+ ("multipleOf" , multipleOf),
304+ ("items" , items),
305+ ("minItems" , minItems),
306+ ("maxItems" , maxItems),
307+ ("required" , required ),
308+ ("minLength" , minLength),
309+ ("maxLength" , maxLength),
310+ ("pattern" , pattern),
311+ ("contentEncoding" , contentEncoding),
312+ ("contentMediaType" , contentMediaType),
313+ ("oneOf" , oneOf),
314+ ("properties" , properties),
315+ ];
316+
317+ for (final (key, value) in keyValuePairs) {
318+ final dynamic convertedValue;
319+
320+ switch (value) {
321+ case null :
322+ continue ;
323+ case List <Serializable >():
324+ convertedValue = value.toJson ();
325+ case Map <String , Serializable >():
326+ convertedValue = value.toJson ();
327+ default :
328+ convertedValue = value;
329+ }
330+
331+ result[key] = convertedValue;
332+ }
333+
334+ return result;
335+ }
281336}
0 commit comments