/**
 * 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 org.apache.aurora.common.args;

import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * Annotation for a command line argument.
 */
@Target(FIELD)
@Retention(RUNTIME)
public @interface CmdLine {
  /**
   * The short name of the argument, as supplied on the command line.  The argument can also be
   * accessed by the canonical name, which is {@code com.foo.bar.MyArgClass.arg_name}.
   * If the global scope contains more than one argument with the same name, all colliding arguments
   * must be disambiguated with the canonical form.
   *
   * The argument name must match the format {@code [\w\-\.]+}.
   */
  String name();

  /**
   * The help string to display on the command line in a usage message.
   */
  String help();

  /**
   * The parser class to use for parsing this argument.  The parser must return the same type as
   * the field being annotated.
   */
  Class<? extends Parser<?>> parser() default NoParser.class;

  /**
   * The flag to indicate whether an argument file is accepted for this argument.
   *
   */
  boolean argFile() default false;
}
