/* * Copyright (c) 2011-2015 The original author or authors * ------------------------------------------------------ * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * and Apache License v2.0 which accompanies this distribution. * * The Eclipse Public License is available at * http://www.eclipse.org/legal/epl-v10.html * * The Apache License v2.0 is available at * http://www.opensource.org/licenses/apache2.0.php * * You may elect to redistribute this code under either of these licenses. */ package io.vertx.core.cli.impl; import io.vertx.core.cli.*; import java.util.*; import java.util.stream.Collectors; /** * Default implementation of {@link CLI}. * * @author Clement Escoffier <clement@apache.org> */ public class DefaultCLI implements CLI { protected String name; protected String description; protected String summary; protected boolean hidden; protected List<Option> options = new ArrayList<>(); private List<Argument> arguments = new ArrayList<>(); /** * Parses the user command line interface and create a new {@link CommandLine} containing extracting values. * * @param arguments the arguments * @return the creates command line */ @Override public CommandLine parse(List<String> arguments) { return new DefaultParser().parse(this, arguments); } /** * Parses the user command line interface and create a new {@link CommandLine} containing extracting values. * * @param arguments the arguments * @param validate enable / disable parsing validation * @return the creates command line */ @Override public CommandLine parse(List<String> arguments, boolean validate) { return new DefaultParser().parse(this, arguments, validate); } @Override public String getName() { return name; } @Override public CLI setName(String name) { Objects.requireNonNull(name); if (name.isEmpty()) { throw new IllegalArgumentException("Invalid command name"); } this.name = name; return this; } @Override public String getDescription() { return description; } @Override public CLI setDescription(String desc) { Objects.requireNonNull(desc); description = desc; return this; } @Override public String getSummary() { return summary; } @Override public CLI setSummary(String summary) { Objects.requireNonNull(summary); this.summary = summary; return this; } @Override public boolean isHidden() { return hidden; } @Override public CLI setHidden(boolean hidden) { this.hidden = hidden; return this; } @Override public List<Option> getOptions() { return options; } @Override public CLI addOption(Option option) { Objects.requireNonNull(option); options.add(option); return this; } @Override public CLI addOptions(List<Option> options) { Objects.requireNonNull(options); options.forEach(this::addOption); return this; } @Override public CLI setOptions(List<Option> options) { Objects.requireNonNull(options); this.options = new ArrayList<>(); return addOptions(options); } @Override public List<Argument> getArguments() { return arguments; } @Override public CLI addArgument(Argument arg) { Objects.requireNonNull(arg); arguments.add(arg); return this; } @Override public CLI addArguments(List<Argument> args) { Objects.requireNonNull(args); args.forEach(this::addArgument); return this; } @Override public CLI setArguments(List<Argument> args) { Objects.requireNonNull(args); arguments = new ArrayList<>(args); return this; } @Override public Option getOption(String name) { Objects.requireNonNull(name); // The option by name look up is a three steps lookup: // first check by long name // then by short name // finally by arg name for (Option option : options) { if (name.equalsIgnoreCase(option.getLongName())) { return option; } } for (Option option : options) { if (name.equalsIgnoreCase(option.getShortName())) { return option; } } for (Option option : options) { if (name.equalsIgnoreCase(option.getArgName())) { return option; } } return null; } @Override public Argument getArgument(String name) { Objects.requireNonNull(name); for (Argument arg : arguments) { if (name.equalsIgnoreCase(arg.getArgName())) { return arg; } } return null; } @Override public Argument getArgument(int index) { if (index < 0) { throw new IllegalArgumentException("Given index cannot be negative"); } for (Argument arg : arguments) { if (index == arg.getIndex()) { return arg; } } return null; } @Override public CLI removeOption(String name) { options = options.stream().filter(o -> !o.getLongName().equals(name) && !o.getShortName().equals(name)) .collect(Collectors.toList()); return this; } @Override public CLI removeArgument(int index) { for (Argument arg : new TreeSet<>(arguments)) { if (arg.getIndex() == index) { arguments.remove(arg); return this; } } return this; } @Override public CLI usage(StringBuilder builder) { new UsageMessageFormatter().usage(builder, this); return this; } @Override public CLI usage(StringBuilder builder, String prefix) { new UsageMessageFormatter().usage(builder, prefix, this); return this; } }