blob: 9396a7aacb2e32420da3db9aa946cb4cc60f45a2 [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 'package:args/args.dart';
class CliParser {
final ArgParser parser = () {
final parser = ArgParser();
parser.addFlag(
'help',
abbr: 'h',
help: 'Show this help.',
);
parser.addMultiOption(
'define',
abbr: 'D',
help: '''Define or override a config property from command line.
The same option can be passed multiple times.
Keys should only contain lower-case alphanumeric characters, underscores,
and '.'s''',
);
parser.addOption(
'config',
abbr: 'c',
help: '''Path to JSON or YAML config file.
Keys should only contain lower-case alphanumeric characters, and underscores.
Hierarchies should be maps.''',
);
return parser;
}();
ArgResults parse(List<String> args) => parser.parse(args);
}
class DefinesParser {
static final _defineRegex = RegExp('([a-z_.]+)=(.+)');
Map<String, List<String>> parse(List<String> args) {
final defines = <String, List<String>>{};
for (final arg in args) {
final match = _defineRegex.matchAsPrefix(arg);
if (match == null || match.group(0) != arg) {
throw FormatException("Define '$arg' does not match expected pattern "
"'${_defineRegex.pattern}'.");
}
final key = match.group(1)!;
final value = match.group(2)!;
defines[key] = (defines[key] ?? [])..add(value);
}
return defines;
}
}