package org.checkerframework.checker.i18nformatter.qual;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.checkerframework.framework.qual.SubtypeOf;

/**
 * This annotation, attached to a String type, indicates that the String may be passed to {@link
 * java.text.MessageFormat#format(String, Object...) MessageFormat.format}.
 *
 * <p>The annotation's value represents the valid arguments that may be passed to the format method.
 * For example:
 *
 * <pre>{@literal @}I18nFormat({GENERAL, NUMBER}) String f;
 *
 * f = "{0}{1, number}"; // valid
 * f = "{0} {1} {2}"; // error, the format string is stronger (more restrictive) than the specifiers.
 * f = "{0, number} {1, number}"; // error, the format string is stronger (NUMBER is a subtype of GENERAL).
 * </pre>
 *
 * The annotation indicates that the format string requires any object as the first parameter
 * ({@link I18nConversionCategory#GENERAL}) and a number as the second parameter ({@link
 * I18nConversionCategory#NUMBER}).
 *
 * @see I18nConversionCategory
 * @checker_framework.manual #i18n-formatter-checker Internationalization Format String Checker
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE_USE, ElementType.TYPE_PARAMETER})
@SubtypeOf(I18nUnknownFormat.class)
public @interface I18nFormat {
  /**
   * An array of {@link I18nConversionCategory}, indicating the types of legal remaining arguments
   * when a value of the annotated type is used as the first argument to {@link
   * java.text.MessageFormat#format(String, Object...) Message.format}.
   */
  I18nConversionCategory[] value();
}
