blob: ab93b68b1f7ba3e87932e5fc219581dfbcbe63f9 [file] [log] [blame]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:convert';
import 'package:lib.app.dart/logging.dart';
import '../../com.fuchsia.contact.dart';
import '../entity_codec.dart';
const String _kType = 'com.fuchsia.contact';
/// The [EntityCodec] that translates the [ContactEntityData]
class ContactEntityCodec extends EntityCodec<ContactEntityData> {
/// Constructor
ContactEntityCodec()
: super(
type: _kType,
encode: _encode,
decode: _decode,
);
}
/// Encodes [ContactEntityData] into a [String]
String _encode(ContactEntityData contact) {
Map<String, Object> data = <String, Object>{};
EmailEntityCodec emailCodec = EmailEntityCodec();
PhoneNumberEntityCodec phoneCodec = PhoneNumberEntityCodec();
data['id'] = contact.id;
data['displayName'] = contact.displayName;
data['givenName'] = contact.givenName;
data['middleName'] = contact.middleName;
data['familyName'] = contact.familyName;
data['photoUrl'] = contact.photoUrl;
data['emailAddresses'] =
contact.emailAddresses.map(emailCodec.encode).toList();
data['phoneNumbers'] = contact.phoneNumbers.map(phoneCodec.encode).toList();
return json.encode(data);
}
/// Decodes [String] into a structured [ContactEntityData]
ContactEntityData _decode(String data) {
if (data == null || data.isEmpty) {
return null;
}
try {
Map<String, dynamic> decodedJson = json.decode(data);
EmailEntityCodec emailCodec = EmailEntityCodec();
PhoneNumberEntityCodec phoneNumberCodec = PhoneNumberEntityCodec();
return ContactEntityData(
id: decodedJson['id'],
displayName: decodedJson['displayName'],
givenName: decodedJson['givenName'] ?? '',
familyName: decodedJson['familyName'] ?? '',
middleName: decodedJson['middleName'] ?? '',
photoUrl: decodedJson['photoUrl'] ?? '',
emailAddresses: decodedJson['emailAddresses']
.map((String emailJson) => emailCodec.decode(emailJson))
.toList(),
phoneNumbers: decodedJson['phoneNumbers']
.map((String numberJson) => phoneNumberCodec.decode(numberJson))
.toList(),
);
} on Exception catch (e) {
// since this is just a first pass, not really going to do too much
// additional validation here but would like to know if this ever does
// error out
log.warning('$_kType entity error when decoding from json string: $json'
'\nerror: $e');
rethrow;
}
}