Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(301)

Side by Side Diff: observatory_pub_packages/args/src/arg_parser.dart

Issue 816693004: Add observatory_pub_packages snapshot to third_party (Closed) Base URL: http://dart.googlecode.com/svn/third_party/
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file.
4
5 library args.src.arg_parser;
6
7 import 'package:collection/wrappers.dart';
8
9 import 'arg_results.dart';
10 import 'option.dart';
11 import 'parser.dart';
12 import 'usage.dart';
13
14 /// A class for taking a list of raw command line arguments and parsing out
15 /// options and flags from them.
16 class ArgParser {
17 final Map<String, Option> _options;
18 final Map<String, ArgParser> _commands;
19
20 /// The options that have been defined for this parser.
21 final Map<String, Option> options;
22
23 /// The commands that have been defined for this parser.
24 final Map<String, ArgParser> commands;
25
26 /// Whether or not this parser parses options that appear after non-option
27 /// arguments.
28 final bool allowTrailingOptions;
29
30 /// Creates a new ArgParser.
31 ///
32 /// If [allowTrailingOptions] is set, the parser will continue parsing even
33 /// after it finds an argument that is neither an option nor a command.
34 /// This allows options to be specified after regular arguments. Defaults to
35 /// `false`.
36 factory ArgParser({bool allowTrailingOptions}) =>
37 new ArgParser._(<String, Option>{}, <String, ArgParser>{},
38 allowTrailingOptions: allowTrailingOptions);
39
40 ArgParser._(Map<String, Option> options, Map<String, ArgParser> commands,
41 {bool allowTrailingOptions}) :
42 this._options = options,
43 this.options = new UnmodifiableMapView(options),
44 this._commands = commands,
45 this.commands = new UnmodifiableMapView(commands),
46 this.allowTrailingOptions = allowTrailingOptions != null ?
47 allowTrailingOptions : false;
48
49 /// Defines a command.
50 ///
51 /// A command is a named argument which may in turn define its own options and
52 /// subcommands using the given parser. If [parser] is omitted, implicitly
53 /// creates a new one. Returns the parser for the command.
54 ArgParser addCommand(String name, [ArgParser parser]) {
55 // Make sure the name isn't in use.
56 if (_commands.containsKey(name)) {
57 throw new ArgumentError('Duplicate command "$name".');
58 }
59
60 if (parser == null) parser = new ArgParser();
61 _commands[name] = parser;
62 return parser;
63 }
64
65 /// Defines a flag. Throws an [ArgumentError] if:
66 ///
67 /// * There is already an option named [name].
68 /// * There is already an option using abbreviation [abbr].
69 void addFlag(String name, {String abbr, String help, bool defaultsTo: false,
70 bool negatable: true, void callback(bool value), bool hide: false}) {
71 _addOption(name, abbr, help, null, null, null, defaultsTo, callback,
72 OptionType.FLAG, negatable: negatable, hide: hide);
73 }
74
75 /// Defines a value-taking option. Throws an [ArgumentError] if:
76 ///
77 /// * There is already an option with name [name].
78 /// * There is already an option using abbreviation [abbr].
79 void addOption(String name, {String abbr, String help, String valueHelp,
80 List<String> allowed, Map<String, String> allowedHelp, String defaultsTo,
81 void callback(value), bool allowMultiple: false, bool hide: false}) {
82 _addOption(name, abbr, help, valueHelp, allowed, allowedHelp, defaultsTo,
83 callback, allowMultiple ? OptionType.MULTIPLE : OptionType.SINGLE,
84 hide: hide);
85 }
86
87 void _addOption(String name, String abbr, String help, String valueHelp,
88 List<String> allowed, Map<String, String> allowedHelp, defaultsTo,
89 void callback(value), OptionType type, {bool negatable: false,
90 bool hide: false}) {
91 // Make sure the name isn't in use.
92 if (_options.containsKey(name)) {
93 throw new ArgumentError('Duplicate option "$name".');
94 }
95
96 // Make sure the abbreviation isn't too long or in use.
97 if (abbr != null) {
98 var existing = findByAbbreviation(abbr);
99 if (existing != null) {
100 throw new ArgumentError(
101 'Abbreviation "$abbr" is already used by "${existing.name}".');
102 }
103 }
104
105 _options[name] = newOption(name, abbr, help, valueHelp, allowed,
106 allowedHelp, defaultsTo, callback, type, negatable: negatable,
107 hide: hide);
108 }
109
110 /// Parses [args], a list of command-line arguments, matches them against the
111 /// flags and options defined by this parser, and returns the result.
112 ArgResults parse(List<String> args) =>
113 new Parser(null, this, args.toList(), null, null).parse();
114
115 /// Generates a string displaying usage information for the defined options.
116 ///
117 /// This is basically the help text shown on the command line.
118 @Deprecated("Replaced with get usage. getUsage() will be removed in args 1.0")
119 String getUsage() => new Usage(this).generate();
120
121 /// Generates a string displaying usage information for the defined options.
122 ///
123 /// This is basically the help text shown on the command line.
124 String get usage => new Usage(this).generate();
125
126 /// Get the default value for an option. Useful after parsing to test if the
127 /// user specified something other than the default.
128 getDefault(String option) {
129 if (!options.containsKey(option)) {
130 throw new ArgumentError('No option named $option');
131 }
132 return options[option].defaultValue;
133 }
134
135 /// Finds the option whose abbreviation is [abbr], or `null` if no option has
136 /// that abbreviation.
137 Option findByAbbreviation(String abbr) {
138 return options.values.firstWhere((option) => option.abbreviation == abbr,
139 orElse: () => null);
140 }
141 }
OLDNEW
« no previous file with comments | « observatory_pub_packages/args/command_runner.dart ('k') | observatory_pub_packages/args/src/arg_results.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698