| // Copyright (c) 2023, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'source.dart'; | |
| class FileSource extends Source { | |
| /// Configuration options passed in via a JSON or YAML configuration file. | |
| /// | |
| /// Stored as a partial hierarchical data structure. The values can be maps | |
| /// in which subsequent parts of a key after a `.` can be resolved. | |
| final Map<String, dynamic> _file; | |
| /// If provided, used to resolve paths within [_file]. | |
| @override | |
| final Uri? baseUri; | |
| FileSource(this._file, this.baseUri); | |
| @override | |
| String? optionalString(String key) => optionalValueOf<String>(key); | |
| @override | |
| List<String>? optionalStringList( | |
| String key, { | |
| String? splitPattern, | |
| }) { | |
| assert(splitPattern == null); | |
| return optionalValueOf<List<dynamic>>(key)?.cast<String>(); | |
| } | |
| @override | |
| bool? optionalBool(String key) => optionalValueOf<bool>(key); | |
| @override | |
| int? optionalInt(String key) => optionalValueOf<int>(key); | |
| @override | |
| double? optionalDouble(String key) => optionalValueOf<double>(key); | |
| @override | |
| T? optionalValueOf<T>(String key) { | |
| Object? cursor = _file; | |
| var current = ''; | |
| for (final keyPart in key.split('.')) { | |
| if (cursor == null) { | |
| return null; | |
| } | |
| if (cursor is! Map) { | |
| throw FormatException( | |
| "Unexpected value '$cursor' for key '$current' in config file. " | |
| 'Expected a Map.'); | |
| } else { | |
| cursor = cursor[keyPart]; | |
| } | |
| current += '.$keyPart'; | |
| } | |
| if (cursor is! T?) { | |
| throw FormatException( | |
| "Unexpected value '$cursor' for key '$current' in config file. " | |
| 'Expected a $T.'); | |
| } | |
| return cursor; | |
| } | |
| @override | |
| String toString() => 'FileSource(file: $_file, fileUri: $baseUri)'; | |
| } |