Commit 6a1f47a5 authored by yjbanov's avatar yjbanov Committed by Yegor Jbanov

factor out enum indexing into reusable EnumIndex

parent 61b2657b
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/// Indexes a list of `enum` values by simple name.
///
/// In Dart enum names are prefixed with enum class name. For example, for
/// `enum Vote { yea, nay }`, `Vote.yea.toString()` produces `"Vote.yea"`
/// rather than just `"yea"` - the simple name.
///
/// Example:
///
/// enum Vote { yea, nay }
/// final index = new EnumIndex(Vote.values);
/// index.lookupBySimpleName('yea'); // returns Vote.yea
/// index.toSimpleName(Vote.nay); // returns 'nay'
class EnumIndex<E> {
/// Creates an index of [enumValues].
EnumIndex(List<E> enumValues)
: _nameToValue = new Map<String, E>.fromIterable(
enumValues,
key: _getSimpleName
),
_valueToName = new Map<E, String>.fromIterable(
enumValues,
value: _getSimpleName
);
final Map<String, E> _nameToValue;
final Map<E, String> _valueToName;
/// Given a [simpleName] finds the corresponding enum value.
E lookupBySimpleName(String simpleName) => _nameToValue[simpleName];
/// Returns the simple name for [enumValue].
String toSimpleName(E enumValue) => _valueToName[enumValue];
}
String _getSimpleName(dynamic enumValue) {
return enumValue.toString().split('.').last;
}
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'enum_util.dart';
import 'message.dart'; import 'message.dart';
/// Requests an application health check. /// Requests an application health check.
...@@ -22,6 +23,9 @@ enum HealthStatus { ...@@ -22,6 +23,9 @@ enum HealthStatus {
bad, bad,
} }
final EnumIndex<HealthStatus> _healthStatusIndex =
new EnumIndex<HealthStatus>(HealthStatus.values);
/// Application health status. /// Application health status.
class Health extends Result { class Health extends Result {
Health(this.status) { Health(this.status) {
...@@ -29,26 +33,13 @@ class Health extends Result { ...@@ -29,26 +33,13 @@ class Health extends Result {
} }
static Health fromJson(Map<String, dynamic> json) { static Health fromJson(Map<String, dynamic> json) {
return new Health(_statusFromId(json['status'])); return new Health(_healthStatusIndex.lookupBySimpleName(json['status']));
} }
/// Health status /// Health status
final HealthStatus status; final HealthStatus status;
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {
'status': _getStatusId(status) 'status': _healthStatusIndex.toSimpleName(status)
}; };
} }
String _getStatusId(HealthStatus status) => status.toString().split('.').last;
final Map<String, HealthStatus> _idToStatus = new Map<String, HealthStatus>.fromIterable(
HealthStatus.values,
key: _getStatusId
);
HealthStatus _statusFromId(String id) {
return _idToStatus.containsKey(id)
? _idToStatus[id]
: throw new ArgumentError.value(id, 'id', 'unknown');
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment