blob: 57978318feae73f034941ea7932ead05e81885ce [file] [log] [blame]
// Copyright 2019 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.
/// Utility methods for working with the [IntlSettings] FIDL struct.
library intl_settings_util;
import 'dart:convert';
import 'package:fidl_fuchsia_setui/fidl.dart';
IntlSettings applyMutation(IntlSettings settings, Mutation mutation) {
switch (mutation.$tag) {
case MutationTag.localesMutationValue:
return setLocales(settings, mutation.localesMutationValue);
case MutationTag.hourCycleMutationValue:
return setHourCycle(settings, mutation.hourCycleMutationValue);
case MutationTag.temperatureUnitMutationValue:
return setTemperatureUnit(
settings, mutation.temperatureUnitMutationValue);
default:
throw ArgumentError('Unsupported mutation type');
}
}
IntlSettings setLocales(IntlSettings settings, LocalesMutation mutation) {
return IntlSettings(
locales: mutation.locales,
hourCycle: settings.hourCycle,
temperatureUnit: settings.temperatureUnit);
}
IntlSettings setHourCycle(IntlSettings settings, HourCycleMutation mutation) {
if (settings.hourCycle != mutation.hourCycle) {
return IntlSettings(
locales: settings.locales,
hourCycle: mutation.hourCycle,
temperatureUnit: settings.temperatureUnit);
}
return settings;
}
IntlSettings setTemperatureUnit(
IntlSettings settings, TemperatureUnitMutation mutation) {
if (settings.temperatureUnit != mutation.temperatureUnit) {
return IntlSettings(
locales: settings.locales,
hourCycle: settings.hourCycle,
temperatureUnit: mutation.temperatureUnit);
}
return settings;
}
/// JSON encoder, since there's no standard one for FIDL.
String toJson(IntlSettings settings) {
Map<String, dynamic> map = {
'locales': settings.locales,
'hour_cycle': settings.hourCycle == HourCycle.h12 ? 'h12' : 'h23',
'temperature_unit': settings.temperatureUnit == TemperatureUnit.celsius
? 'celsius'
: 'fahrenheit'
};
return jsonEncode(map);
}
/// JSON decoder, since there's no standard one for FIDL.
IntlSettings fromJson(String json) {
Map<String, dynamic> parsed = jsonDecode(json);
return IntlSettings(
locales: List<String>.from(parsed['locales']),
hourCycle: HourCycle.$valuesMap[parsed['hour_cycle']],
temperatureUnit: TemperatureUnit.$valuesMap[parsed['temperature_unit']]);
}