| // Copyright 2014 The Flutter 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. This class provides methods for | |
| /// getting and looking up by simple names. | |
| /// | |
| /// Example: | |
| /// | |
| /// enum Vote { yea, nay } | |
| /// final index = 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 = Map<String, E>.fromIterable(enumValues, key: _getSimpleName), | |
| _valueToName = 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. | |
| /// | |
| /// Throws an [ArgumentError] if [simpleName] is not valid. | |
| /// | |
| /// The [path] is the path in the parent JSON structure at which this value | |
| /// was found, and will be reported in any [ArgumentError]s as the name. | |
| E lookupBySimpleName(String simpleName, {String? path}) { | |
| final E? value = _nameToValue[simpleName]; | |
| if (value == null) { | |
| throw ArgumentError.value( | |
| simpleName, | |
| path, | |
| 'Invalid enum value, valid values are ${_nameToValue.keys.join(', ')}', | |
| ); | |
| } | |
| return value; | |
| } | |
| /// Returns the simple name for [enumValue]. | |
| String toSimpleName(E enumValue) => _valueToName[enumValue]!; | |
| } | |
| String _getSimpleName(dynamic enumValue) { | |
| return enumValue.toString().split('.').last; | |
| } |