enum_util.dart 1.41 KB
Newer Older
1 2 3 4 5 6 7 8
// 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"`
9 10
/// rather than just `"yea"` - the simple name. This class provides methods for
/// getting and looking up by simple names.
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
///
/// 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;
}