blob: 6e9f8ff568af57c95a7f4da577382165baeb952f [file] [log] [blame]
// Copyright (c) 2016, Google Inc. Please see the AUTHORS file for details.
// All rights reserved. Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
import 'package:built_collection/built_collection.dart';
import 'package:built_value/serializer.dart';
class BuiltListMultimapSerializer
implements StructuredSerializer<BuiltListMultimap> {
final bool structured = true;
@override
final Iterable<Type> types = BuiltList<Type>(
[BuiltListMultimap, BuiltListMultimap<Object, Object>().runtimeType]);
@override
final String wireName = 'listMultimap';
@override
Iterable<Object?> serialize(
Serializers serializers, BuiltListMultimap builtListMultimap,
{FullType specifiedType = FullType.unspecified}) {
var isUnderspecified =
specifiedType.isUnspecified || specifiedType.parameters.isEmpty;
if (!isUnderspecified) serializers.expectBuilder(specifiedType);
var keyType = specifiedType.parameters.isEmpty
? FullType.unspecified
: specifiedType.parameters[0];
var valueType = specifiedType.parameters.isEmpty
? FullType.unspecified
: specifiedType.parameters[1];
var result = <Object?>[];
for (var key in builtListMultimap.keys) {
result.add(serializers.serialize(key, specifiedType: keyType));
result.add(builtListMultimap[key]
.map(
(value) => serializers.serialize(value, specifiedType: valueType))
.toList());
}
return result;
}
@override
BuiltListMultimap deserialize(
Serializers serializers, Iterable<Object?> serialized,
{FullType specifiedType = FullType.unspecified}) {
var isUnderspecified =
specifiedType.isUnspecified || specifiedType.parameters.isEmpty;
var keyType = specifiedType.parameters.isEmpty
? FullType.unspecified
: specifiedType.parameters[0];
var valueType = specifiedType.parameters.isEmpty
? FullType.unspecified
: specifiedType.parameters[1];
var result = isUnderspecified
? ListMultimapBuilder<Object, Object>()
: serializers.newBuilder(specifiedType) as ListMultimapBuilder;
if (serialized.length % 2 == 1) {
throw ArgumentError('odd length');
}
for (var i = 0; i != serialized.length; i += 2) {
final key = serializers.deserialize(serialized.elementAt(i),
specifiedType: keyType);
final values = (serialized.elementAt(i + 1) as Iterable<Object?>).map(
(value) => serializers.deserialize(value, specifiedType: valueType));
for (var value in values) {
result.add(key, value);
}
}
return result.build();
}
}