blob: 20e662c191d4e0e4aa4e96ff3a1eec0b4367fc42 [file] [log] [blame]
// 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 'config.dart';
import 'source.dart';
class CliSource extends Source {
/// Configuration options passed in via CLI arguments.
///
/// Options can be passed multiple times, so the values here are a list.
///
/// Stored as a flat non-hierarchical structure, keys contain `.`.
final Map<String, List<String>> _cli;
/// If provided, used to resolve paths within [_cli].
///
/// Typically the current working directory at application start.
@override
final Uri? baseUri;
CliSource(this._cli, this.baseUri);
@override
String? optionalString(String key) {
final value = _cli[key];
if (value == null) {
return null;
}
if (value.length > 1) {
throw FormatException(
"More than one value was passed for '$key' in the CLI defines."
' Values passed: $value');
}
return value.single;
}
@override
List<String>? optionalStringList(
String key, {
String? splitPattern,
}) {
final cliValue = _cli[key];
if (cliValue == null) {
return null;
}
if (splitPattern != null) {
return [for (final value in cliValue) ...value.split(splitPattern)];
}
return cliValue;
}
@override
bool? optionalBool(String key) {
final stringValue = optionalString(key);
if (stringValue != null) {
Source.throwIfUnexpectedValue(key, stringValue, Config.boolStrings.keys);
return Config.boolStrings[stringValue]!;
}
return null;
}
@override
int? optionalInt(String key) {
final stringValue = optionalString(key);
if (stringValue != null) {
try {
return int.parse(stringValue);
} on FormatException catch (e) {
throw FormatException(
"Unexpected value '$stringValue' for key '$key'. Expected an int."
' ${e.message}');
}
}
return null;
}
@override
double? optionalDouble(String key) {
final stringValue = optionalString(key);
if (stringValue != null) {
try {
return double.parse(stringValue);
} on FormatException catch (e) {
throw FormatException(
"Unexpected value '$stringValue' for key '$key'. Expected a double."
' ${e.message}');
}
}
return null;
}
@override
String toString() => 'CliSource($_cli)';
}