| // 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 'dart:io'; |
| |
| abstract class Source { |
| /// If provided, the uri used for resolving paths. |
| Uri? get baseUri; |
| |
| /// Lookup a nullable string value. |
| String? optionalString(String key); |
| |
| /// Lookup a nullable string list. |
| /// |
| /// If provided, [splitPattern] splits config. |
| List<String>? optionalStringList( |
| String key, { |
| String? splitPattern, |
| }); |
| |
| /// Lookup an optional boolean value. |
| bool? optionalBool(String key); |
| |
| /// Lookup an optional int value. |
| int? optionalInt(String key); |
| |
| /// Lookup an optional int value. |
| double? optionalDouble(String key); |
| |
| /// Lookup an optional value of type [T]. |
| /// |
| /// Does not support specialized options such as `splitPattern`. One must |
| /// use the specialized methods such as [optionalStringList] for that. |
| /// |
| /// Returns `null` if the source cannot provide a value of type [T]. |
| T? optionalValueOf<T>(String key) { |
| if (T == bool) { |
| return optionalBool(key) as T?; |
| } |
| if (T == String) { |
| return optionalString(key) as T?; |
| } |
| if (T == List<String>) { |
| return optionalStringList(key) as T?; |
| } |
| return null; |
| } |
| |
| static void throwIfUnexpectedValue<T>( |
| String key, T value, Iterable<T> validValues) { |
| if (!validValues.contains(value)) { |
| throw FormatException( |
| "Unexpected value '$value' for key '$key'. Expected one of: " |
| "${validValues.map((e) => "'$e'").join(', ')}."); |
| } |
| } |
| |
| static Uri fileSystemPathToUri(String path) { |
| if (path.endsWith(Platform.pathSeparator)) { |
| return Uri.directory(path); |
| } |
| return Uri.file(path); |
| } |
| } |