blob: c30788da5120fd5dc1106b73c86c1fcc336d0ebb [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 '../entity_codec.dart';
import 'geolocation_entity_data.dart';
export 'geolocation_entity_data.dart';
/// Translates Entity source data to and from the structured
/// [GeolocationEntityData].
class GeolocationEntityCodec extends EntityCodec<GeolocationEntityData> {
/// Create an instance of [GeolocationEntityCodec].
GeolocationEntityCodec()
: super(
type: 'com.fuchsia.location.geolocation',
encode: _encode,
decode: _decode,
);
}
/// Encodes [GeolocationEntityData] into a [String].
String _encode(GeolocationEntityData data) {
assert(data != null);
Map<String, Object> map = <String, Object>{
'location': <String, double>{
'lat': data.lat,
'long': data.long,
},
'accuracy': data.accuracy,
};
return json.encode(map);
}
/// Decodes [String] into a structured [GeolocationEntityCodec].
GeolocationEntityData _decode(String data) {
if (data == null || data.isEmpty || data == 'null') {
throw FormatException('Entity data is null: "$data"');
}
// TODO(MS-1428): use a schema to validate decoded value.
Map<String, dynamic> map = json.decode(data);
double lat;
double long;
double accuracy;
try {
Map<String, double> location = map['location'].cast<String, double>();
lat = location['lat'];
long = location['long'];
accuracy = map['accuracy'];
// ignore: avoid_catches_without_on_clauses
} catch (err, stackTrace) {
log.warning(
'Exception occured during JSON destructuring: \n$err\n$stackTrace');
throw FormatException('Invalid JSON data: "$map"');
}
return GeolocationEntityData(
lat: lat,
long: long,
accuracy: accuracy,
);
}