MdYamlDoc: Serialize lists and maps

This commit is contained in:
Vishesh Handa
2021-12-22 21:03:41 +01:00
parent e3a154f33d
commit ff1dc06403
5 changed files with 111 additions and 1 deletions

View File

@ -10,6 +10,7 @@ import 'package:flutter/foundation.dart';
import 'package:collection/collection.dart';
import 'package:fixnum/fixnum.dart' as fixnum;
import 'package:yaml/yaml.dart';
import 'package:gitjournal/generated/core.pb.dart' as pb;
import 'package:gitjournal/utils/datetime.dart';
@ -84,6 +85,24 @@ pb.Union _toUnion(dynamic val) {
return pb.Union(dateValue: val.toProtoBuf());
}
if (val is YamlList || val is List) {
var list = <pb.Union>[];
for (var v in val) {
list.add(_toUnion(v));
}
return pb.Union(listValue: list);
}
if (val is Map) {
var map = <String, pb.Union>{};
for (var e in val.entries) {
map[e.key.toString()] = _toUnion(e.value);
}
return pb.Union(mapValue: map);
}
throw Exception(
"Type cannot be converted to Protobuf Union - ${val.runtimeType}");
}
@ -97,6 +116,18 @@ dynamic _fromUnion(pb.Union u) {
return u.booleanValue;
} else if (u.hasDateValue()) {
return u.dateValue.toDateTime();
} else if (u.listValue.isNotEmpty) {
var list = <dynamic>[];
for (var v in u.listValue) {
list.add(_fromUnion(v));
}
return list;
} else if (u.mapValue.isNotEmpty) {
var map = <String, dynamic>{};
for (var e in u.mapValue.entries) {
map[e.key] = _fromUnion(e.value);
}
return map;
}
throw Exception("Type cannot be converted from Protobuf Union");

View File

@ -678,6 +678,25 @@ class Union extends $pb.GeneratedMessage {
? ''
: 'intValue',
protoName: 'intValue')
..pc<Union>(
5,
const $core.bool.fromEnvironment('protobuf.omit_field_names')
? ''
: 'listValue',
$pb.PbFieldType.PM,
protoName: 'listValue',
subBuilder: Union.create)
..m<$core.String, Union>(
6,
const $core.bool.fromEnvironment('protobuf.omit_field_names')
? ''
: 'mapValue',
protoName: 'mapValue',
entryClassName: 'Union.MapValueEntry',
keyFieldType: $pb.PbFieldType.OS,
valueFieldType: $pb.PbFieldType.OM,
valueCreator: Union.create,
packageName: const $pb.PackageName('gitjournal'))
..hasRequiredFields = false;
Union._() : super();
@ -686,6 +705,8 @@ class Union extends $pb.GeneratedMessage {
$core.String? stringValue,
DateTimeAnyTz? dateValue,
$fixnum.Int64? intValue,
$core.Iterable<Union>? listValue,
$core.Map<$core.String, Union>? mapValue,
}) {
final _result = create();
if (booleanValue != null) {
@ -700,6 +721,12 @@ class Union extends $pb.GeneratedMessage {
if (intValue != null) {
_result.intValue = intValue;
}
if (listValue != null) {
_result.listValue.addAll(listValue);
}
if (mapValue != null) {
_result.mapValue.addAll(mapValue);
}
return _result;
}
factory Union.fromBuffer($core.List<$core.int> i,
@ -781,6 +808,12 @@ class Union extends $pb.GeneratedMessage {
$core.bool hasIntValue() => $_has(3);
@$pb.TagNumber(4)
void clearIntValue() => clearField(4);
@$pb.TagNumber(5)
$core.List<Union> get listValue => $_getList(4);
@$pb.TagNumber(6)
$core.Map<$core.String, Union> get mapValue => $_getMap(5);
}
class DateTimeAnyTz extends $pb.GeneratedMessage {

View File

@ -270,15 +270,49 @@ const Union$json = const {
'10': 'dateValue'
},
const {'1': 'intValue', '3': 4, '4': 1, '5': 3, '9': 0, '10': 'intValue'},
const {
'1': 'listValue',
'3': 5,
'4': 3,
'5': 11,
'6': '.gitjournal.Union',
'10': 'listValue'
},
const {
'1': 'mapValue',
'3': 6,
'4': 3,
'5': 11,
'6': '.gitjournal.Union.MapValueEntry',
'10': 'mapValue'
},
],
'3': const [Union_MapValueEntry$json],
'8': const [
const {'1': 'UnionOneof'},
],
};
@$core.Deprecated('Use unionDescriptor instead')
const Union_MapValueEntry$json = const {
'1': 'MapValueEntry',
'2': const [
const {'1': 'key', '3': 1, '4': 1, '5': 9, '10': 'key'},
const {
'1': 'value',
'3': 2,
'4': 1,
'5': 11,
'6': '.gitjournal.Union',
'10': 'value'
},
],
'7': const {'7': true},
};
/// Descriptor for `Union`. Decode as a `google.protobuf.DescriptorProto`.
final $typed_data.Uint8List unionDescriptor = $convert.base64Decode(
'CgVVbmlvbhIkCgxib29sZWFuVmFsdWUYASABKAhIAFIMYm9vbGVhblZhbHVlEiIKC3N0cmluZ1ZhbHVlGAIgASgJSABSC3N0cmluZ1ZhbHVlEjkKCWRhdGVWYWx1ZRgDIAEoCzIZLmdpdGpvdXJuYWwuRGF0ZVRpbWVBbnlUekgAUglkYXRlVmFsdWUSHAoIaW50VmFsdWUYBCABKANIAFIIaW50VmFsdWVCDAoKVW5pb25PbmVvZg==');
'CgVVbmlvbhIkCgxib29sZWFuVmFsdWUYASABKAhIAFIMYm9vbGVhblZhbHVlEiIKC3N0cmluZ1ZhbHVlGAIgASgJSABSC3N0cmluZ1ZhbHVlEjkKCWRhdGVWYWx1ZRgDIAEoCzIZLmdpdGpvdXJuYWwuRGF0ZVRpbWVBbnlUekgAUglkYXRlVmFsdWUSHAoIaW50VmFsdWUYBCABKANIAFIIaW50VmFsdWUSLwoJbGlzdFZhbHVlGAUgAygLMhEuZ2l0am91cm5hbC5VbmlvblIJbGlzdFZhbHVlEjsKCG1hcFZhbHVlGAYgAygLMh8uZ2l0am91cm5hbC5Vbmlvbi5NYXBWYWx1ZUVudHJ5UghtYXBWYWx1ZRpOCg1NYXBWYWx1ZUVudHJ5EhAKA2tleRgBIAEoCVIDa2V5EicKBXZhbHVlGAIgASgLMhEuZ2l0am91cm5hbC5VbmlvblIFdmFsdWU6AjgBQgwKClVuaW9uT25lb2Y=');
@$core.Deprecated('Use dateTimeAnyTzDescriptor instead')
const DateTimeAnyTz$json = const {
'1': 'DateTimeAnyTz',

View File

@ -63,6 +63,9 @@ message Union {
DateTimeAnyTz dateValue = 3;
int64 intValue = 4;
}
repeated Union listValue = 5;
map<string, Union> mapValue = 6;
}

View File

@ -6,26 +6,35 @@
import 'dart:collection';
import 'package:dart_git/utils/date_time.dart';
import 'package:test/test.dart';
import 'package:gitjournal/core/markdown/md_yaml_doc.dart';
void main() {
test('Equality', () {
var now = GDateTime(const Duration(hours: 1), 2010, 1, 2, 3, 4, 5);
// ignore: prefer_collection_literals
var aProps = LinkedHashMap<String, dynamic>();
aProps['a'] = 1;
aProps['title'] = "Foo";
aProps['list'] = ["Foo", "Bar", 1];
aProps['map'] = <String, dynamic>{'a': 5};
aProps['date'] = now;
// ignore: prefer_collection_literals
var bProps = LinkedHashMap<String, dynamic>();
bProps['a'] = 1;
bProps['title'] = "Foo";
bProps['list'] = ["Foo", "Bar", 1];
bProps['map'] = <String, dynamic>{'a': 5};
bProps['date'] = now;
var a = MdYamlDoc(body: "a", props: aProps);
var b = MdYamlDoc(body: "a", props: bProps);
expect(a, b);
expect(a, MdYamlDoc.fromProtoBuf(a.toProtoBuf()));
});
}