/*
 * Copyright (c) 2011-2017 Contributors to the Eclipse Foundation
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
 * which is available at https://www.apache.org/licenses/LICENSE-2.0.
 *
 * SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
 */

/**
 * === Typed options and arguments
 *
 * The described {@link io.vertx.core.cli.Option} and {@link io.vertx.core.cli.Argument} classes are _untyped_,
 * meaning that the only get String values.
 * {@link io.vertx.core.cli.TypedOption} and {@link io.vertx.core.cli.TypedArgument} let you specify a _type_, so the
 * (String) raw value is converted to the specified type.
 *
 * Instead of
 * {@link io.vertx.core.cli.Option} and {@link io.vertx.core.cli.Argument}, use {@link io.vertx.core.cli.TypedOption}
 * and {@link io.vertx.core.cli.TypedArgument} in the {@link io.vertx.core.cli.CLI} definition:
 *
 * [source,java]
 * ----
 * {@link examples.cli.TypedCLIExamples#example1}
 * ----
 *
 * Then you can retrieve the converted values as follows:
 *
 * [source,java]
 * ----
 * {@link examples.cli.TypedCLIExamples#example2}
 * ----
 *
 * The vert.x CLI is able to convert to classes:
 *
 * * having a constructor with a single
 * {@link java.lang.String} argument, such as {@link java.io.File} or {@link io.vertx.core.json.JsonObject}
 * * with a static `from` or `fromString` method
 * * with a static `valueOf` method, such as primitive types and enumeration
 *
 * In addition, you can implement your own {@link io.vertx.core.cli.converters.Converter} and instruct the CLI to use
 * this converter:
 *
 * [source,java]
 * ----
 * {@link examples.cli.TypedCLIExamples#example3}
 * ----
 *
 * For booleans, the boolean values are evaluated to {@code true}: `on`, `yes`, `1`, `true`.
 *
 * If one of your option has an `enum` as type, it computes the set of choices automatically.
 *
 * === Using annotations
 *
 * You can also define your CLI using annotations. Definition is done using annotation on the class and on _setter_
 * methods:
 *
 * [source, java]
 * ----
 * &#64;Name("some-name")
 * &#64;Summary("some short summary.")
 * &#64;Description("some long description")
 * public class AnnotatedCli {
 *
 *   private boolean flag;
 *   private String name;
 *   private String arg;
 *
 *  &#64;Option(shortName = "f", flag = true)
 *  public void setFlag(boolean flag) {
 *    this.flag = flag;
 *  }
 *
 *  &#64;Option(longName = "name")
 *  public void setName(String name) {
 *    this.name = name;
 *  }
 *
 *  &#64;Argument(index = 0)
 *  public void setArg(String arg) {
 *   this.arg = arg;
 *  }
 * }
 * ----
 *
 * Once annotated, you can define the {@link io.vertx.core.cli.CLI} and inject the values using:
 *
 * [source,java]
 * ----
 * {@link examples.cli.TypedCLIExamples#example4}
 * ----
 *
 */
package io.vertx.core.cli.annotations;
