diff --git a/src/main/java/io/airlift/airline/Cli.java b/src/main/java/io/airlift/airline/Cli.java index 13f7533f1..f327f45fc 100644 --- a/src/main/java/io/airlift/airline/Cli.java +++ b/src/main/java/io/airlift/airline/Cli.java @@ -117,13 +117,21 @@ public C parse(Iterable<String> args) CommandMetadata command = state.getCommand(); + ImmutableMap.Builder<Class<?>, Object> bindings = ImmutableMap.<Class<?>, Object> builder() + .put(GlobalMetadata.class, metadata) + .put(CommandMetadata.class, command); + + if (state.getGroup() != null) { + bindings.put(CommandGroupMetadata.class, state.getGroup()); + } + return createInstance(command.getType(), command.getAllOptions(), state.getParsedOptions(), command.getArguments(), state.getParsedArguments(), command.getMetadataInjections(), - ImmutableMap.<Class<?>, Object>of(GlobalMetadata.class, metadata)); + bindings.build()); } private void validate(ParseState state) diff --git a/src/test/java/io/airlift/airline/CommandTest.java b/src/test/java/io/airlift/airline/CommandTest.java index e2c203ffd..04beb8ac6 100644 --- a/src/test/java/io/airlift/airline/CommandTest.java +++ b/src/test/java/io/airlift/airline/CommandTest.java @@ -33,6 +33,8 @@ import io.airlift.airline.args.ArgsRequired; import io.airlift.airline.args.ArgsSingleChar; import io.airlift.airline.args.Arity1; +import io.airlift.airline.args.CommandWithHelp; +import io.airlift.airline.args.NeedsCommandGroupMetadata; import io.airlift.airline.args.OptionsRequired; import io.airlift.airline.command.CommandAdd; import io.airlift.airline.command.CommandCommit; @@ -382,4 +384,19 @@ class A } singleCommandParser(A.class).parse("-lon", "32"); } + + public void helpOption() + { + CommandWithHelp command = singleCommandParser(CommandWithHelp.class).parse("CommandWithHelp", "-h"); + Assert.assertTrue(command.helpOption.showHelpIfRequested()); + } + + public void injectCommandGroupMetadata() + { + CliBuilder<NeedsCommandGroupMetadata> builder = Cli.<NeedsCommandGroupMetadata>builder("parser"); + builder.withGroup("group").withDefaultCommand(NeedsCommandGroupMetadata.class); + NeedsCommandGroupMetadata command = builder.build().parse("group"); + Assert.assertNotNull(command.commandGroupMetadata); + Assert.assertEquals(command.commandGroupMetadata.getName(), "group"); + } } diff --git a/src/test/java/io/airlift/airline/args/CommandWithHelp.java b/src/test/java/io/airlift/airline/args/CommandWithHelp.java new file mode 100644 index 000000000..fc1c8899d --- /dev/null +++ b/src/test/java/io/airlift/airline/args/CommandWithHelp.java @@ -0,0 +1,31 @@ +/** + * Copyright (C) 2010 the original author or authors. + * See the notice.md file distributed with this work for additional + * information regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.airlift.airline.args; + +import io.airlift.airline.Command; +import io.airlift.airline.HelpOption; + +import javax.inject.Inject; + +@Command(name = "CommandWithHelp") +public class CommandWithHelp +{ + @Inject + public HelpOption helpOption; +} \ No newline at end of file diff --git a/src/test/java/io/airlift/airline/args/NeedsCommandGroupMetadata.java b/src/test/java/io/airlift/airline/args/NeedsCommandGroupMetadata.java new file mode 100644 index 000000000..91fd1b644 --- /dev/null +++ b/src/test/java/io/airlift/airline/args/NeedsCommandGroupMetadata.java @@ -0,0 +1,30 @@ +/** + * Copyright (C) 2010 the original author or authors. + * See the notice.md file distributed with this work for additional + * information regarding copyright ownership. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package io.airlift.airline.args; + +import io.airlift.airline.Command; +import io.airlift.airline.model.CommandGroupMetadata; + +import javax.inject.Inject; + +@Command(name="NeedsCommandGroupMetadata") +public class NeedsCommandGroupMetadata +{ + @Inject + public CommandGroupMetadata commandGroupMetadata; +} \ No newline at end of file