From 43608478524f050e602b8e04a0495e45ca2a2302 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= <4096670+Citymonstret@users.noreply.github.com> Date: Mon, 6 Jun 2022 20:34:50 +0200 Subject: [PATCH] chore(core): add apiguardian `@API` annotations (#368) --- CHANGELOG.md | 1 + .../kotlin/cloud.base-conventions.gradle.kts | 2 + .../commandframework/ArgumentDescription.java | 2 + .../java/cloud/commandframework/Command.java | 34 ++++++++++++++++- .../commandframework/CommandComponent.java | 5 +++ .../commandframework/CommandHelpHandler.java | 10 +++++ .../commandframework/CommandManager.java | 27 ++++++++++++- .../cloud/commandframework/CommandTree.java | 2 + .../cloud/commandframework/Description.java | 2 + .../LockableCommandManager.java | 2 + .../annotations/AnnotatedElementAccessor.java | 2 + .../annotations/AnnotationAccessor.java | 5 +++ .../MultiDelegateAnnotationAccessor.java | 2 + .../injection/GuiceInjectionService.java | 2 + .../injection/InjectionService.java | 2 + .../injection/ParameterInjector.java | 2 + .../injection/ParameterInjectorRegistry.java | 4 ++ .../annotations/specifier/Completions.java | 2 + .../annotations/specifier/FlagYielding.java | 2 + .../annotations/specifier/Greedy.java | 2 + .../annotations/specifier/Liberal.java | 2 + .../annotations/specifier/Quoted.java | 2 + .../annotations/specifier/Range.java | 2 + .../arguments/CommandArgument.java | 15 ++++++-- .../arguments/CommandSuggestionEngine.java | 2 + .../arguments/CommandSyntaxFormatter.java | 2 + .../DelegatingCommandSuggestionEngine.java | 2 + ...egatingCommandSuggestionEngineFactory.java | 2 + .../DelegatingSuggestionsProvider.java | 2 + .../StandardCommandSyntaxFormatter.java | 3 ++ .../arguments/StaticArgument.java | 2 + .../arguments/compound/ArgumentPair.java | 4 ++ .../arguments/compound/ArgumentTriplet.java | 4 ++ .../arguments/compound/CompoundArgument.java | 2 + .../arguments/compound/FlagArgument.java | 8 ++++ .../arguments/flags/CommandFlag.java | 9 +++++ .../arguments/flags/FlagContext.java | 12 ++++++ .../arguments/parser/ArgumentParseResult.java | 9 ++++- .../arguments/parser/ArgumentParser.java | 6 ++- .../parser/MappedArgumentParser.java | 2 + .../arguments/parser/ParserParameter.java | 2 + .../arguments/parser/ParserParameters.java | 2 + .../arguments/parser/ParserRegistry.java | 4 ++ .../arguments/parser/StandardParameters.java | 5 +++ .../parser/StandardParserRegistry.java | 2 + .../preprocessor/RegexPreprocessor.java | 3 ++ .../arguments/standard/BooleanArgument.java | 7 ++++ .../arguments/standard/ByteArgument.java | 13 +++++++ .../arguments/standard/CharArgument.java | 5 +++ .../arguments/standard/DoubleArgument.java | 10 +++++ .../arguments/standard/DurationArgument.java | 5 +++ .../arguments/standard/EnumArgument.java | 5 +++ .../arguments/standard/FloatArgument.java | 14 +++++++ .../arguments/standard/IntegerArgument.java | 12 ++++++ .../arguments/standard/LongArgument.java | 14 +++++++ .../arguments/standard/ShortArgument.java | 14 +++++++ .../arguments/standard/StringArgument.java | 9 +++++ .../standard/StringArrayArgument.java | 6 +++ .../arguments/standard/UUIDArgument.java | 5 +++ .../commandframework/captions/Caption.java | 2 + .../captions/CaptionRegistry.java | 2 + .../captions/CaptionVariable.java | 2 + .../CaptionVariableReplacementHandler.java | 2 + .../FactoryDelegatingCaptionRegistry.java | 2 + .../captions/SimpleCaptionRegistry.java | 2 + .../SimpleCaptionRegistryFactory.java | 2 + ...mpleCaptionVariableReplacementHandler.java | 2 + .../captions/StandardCaptionKeys.java | 2 + .../context/CommandContext.java | 38 ++++++++++++++++--- .../context/CommandContextFactory.java | 4 ++ .../StandardCommandContextFactory.java | 2 + .../exceptions/AmbiguousNodeException.java | 3 ++ .../exceptions/ArgumentParseException.java | 3 ++ .../exceptions/CommandExecutionException.java | 5 +++ .../exceptions/CommandParseException.java | 3 ++ .../InvalidCommandSenderException.java | 5 +++ .../exceptions/InvalidSyntaxException.java | 3 ++ .../exceptions/NoCommandInLeafException.java | 3 ++ .../exceptions/NoPermissionException.java | 3 ++ .../exceptions/NoSuchCommandException.java | 3 ++ .../parsing/NoInputProvidedException.java | 2 + .../parsing/NumberParseException.java | 2 + .../exceptions/parsing/ParserException.java | 4 ++ ...ynchronousCommandExecutionCoordinator.java | 3 ++ .../CommandExecutionCoordinator.java | 3 ++ .../execution/CommandExecutionHandler.java | 8 ++++ .../execution/CommandResult.java | 2 + .../execution/CommandSuggestionProcessor.java | 2 + .../FilteringCommandSuggestionProcessor.java | 4 +- .../AcceptingCommandPostprocessor.java | 2 + .../CommandPostprocessingContext.java | 2 + .../postprocessor/CommandPostprocessor.java | 2 + .../AcceptingCommandPreprocessor.java | 2 + .../CommandPreprocessingContext.java | 2 + .../preprocessor/CommandPreprocessor.java | 2 + .../CommandConfirmationManager.java | 5 ++- .../internal/CommandInputTokenizer.java | 2 + .../internal/CommandRegistrationHandler.java | 4 ++ .../cloud/commandframework/keys/CloudKey.java | 2 + .../commandframework/keys/CloudKeyHolder.java | 2 + .../commandframework/keys/SimpleCloudKey.java | 2 + .../commandframework/meta/CommandMeta.java | 10 +++++ .../meta/SimpleCommandMeta.java | 6 +++ .../commandframework/meta/SimpleKey.java | 2 + .../permission/AndPermission.java | 2 + .../permission/CommandPermission.java | 6 +++ .../permission/OrPermission.java | 2 + .../permission/Permission.java | 2 + .../permission/PredicatePermission.java | 2 + .../WrappingPredicatePermission.java | 2 + .../types/tuples/DynamicTuple.java | 2 + .../commandframework/types/tuples/Pair.java | 2 + .../types/tuples/Quartet.java | 2 + .../types/tuples/Quintet.java | 2 + .../commandframework/types/tuples/Sextet.java | 2 + .../types/tuples/Triplet.java | 2 + .../commandframework/types/tuples/Tuple.java | 2 + .../commandframework/util/StringUtils.java | 2 + gradle/libs.versions.yml | 5 +++ 119 files changed, 531 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c97ee3ee..036fe420 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Core: Add delegating command execution handlers ([#363](https://github.com/Incendo/cloud/pull/363)) - Core: Add `builder()` getter to `Command.Builder` ([#363](https://github.com/Incendo/cloud/pull/363)) - Core: Add flag yielding modes to `StringArgument` and `StringArrayArgument` ([#367](https://github.com/Incendo/cloud/pull/367)) +- Core: Add [apiguardian](https://github.com/apiguardian-team/apiguardian) `@API` annotations ([#368](https://github.com/Incendo/cloud/pull/368)) - Annotations: Annotation string processors ([#353](https://github.com/Incendo/cloud/pull/353)) - Annotations: `@CommandContainer` annotation processing ([#364](https://github.com/Incendo/cloud/pull/364)) - Annotations: `@CommandMethod` annotation processing for compile-time validation ([#365](https://github.com/Incendo/cloud/pull/365)) diff --git a/build-logic/src/main/kotlin/cloud.base-conventions.gradle.kts b/build-logic/src/main/kotlin/cloud.base-conventions.gradle.kts index 874d048b..2c22d300 100644 --- a/build-logic/src/main/kotlin/cloud.base-conventions.gradle.kts +++ b/build-logic/src/main/kotlin/cloud.base-conventions.gradle.kts @@ -110,6 +110,8 @@ repositories { dependencies { compileOnlyApi(libs.checkerQual) + compileOnlyApi(libs.apiguardian) + testImplementation(libs.jupiterEngine) testImplementation(libs.jupiterParams) testImplementation(libs.mockitoCore) diff --git a/cloud-core/src/main/java/cloud/commandframework/ArgumentDescription.java b/cloud-core/src/main/java/cloud/commandframework/ArgumentDescription.java index d594ad62..c6d52329 100644 --- a/cloud-core/src/main/java/cloud/commandframework/ArgumentDescription.java +++ b/cloud-core/src/main/java/cloud/commandframework/ArgumentDescription.java @@ -24,6 +24,7 @@ package cloud.commandframework; import cloud.commandframework.arguments.CommandArgument; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import static java.util.Objects.requireNonNull; @@ -33,6 +34,7 @@ import static java.util.Objects.requireNonNull; * * @since 1.4.0 */ +@API(status = API.Status.STABLE, since = "1.4.0") public interface ArgumentDescription { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/Command.java b/cloud-core/src/main/java/cloud/commandframework/Command.java index 523629a5..f812e974 100644 --- a/cloud-core/src/main/java/cloud/commandframework/Command.java +++ b/cloud-core/src/main/java/cloud/commandframework/Command.java @@ -48,6 +48,7 @@ import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.stream.Collectors; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -56,6 +57,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * * @param Command sender type */ +@API(status = API.Status.STABLE) public class Command { private final List<@NonNull CommandComponent> components; @@ -75,6 +77,7 @@ public class Command { * @param commandMeta Command meta instance * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public Command( final @NonNull List<@NonNull CommandComponent> commandComponents, final @NonNull CommandExecutionHandler<@NonNull C> commandExecutionHandler, @@ -118,6 +121,7 @@ public class Command { * @param commandMeta Command meta instance * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public Command( final @NonNull List<@NonNull CommandComponent> commandComponents, final @NonNull CommandExecutionHandler<@NonNull C> commandExecutionHandler, @@ -136,6 +140,7 @@ public class Command { * @param commandMeta Command meta instance * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public Command( final @NonNull List<@NonNull CommandComponent> commandComponents, final @NonNull CommandExecutionHandler<@NonNull C> commandExecutionHandler, @@ -157,6 +162,7 @@ public class Command { * @see #Command(List, CommandExecutionHandler, Class, CommandPermission, CommandMeta) */ @Deprecated + @API(status = API.Status.DEPRECATED) public Command( final @NonNull Map<@NonNull CommandArgument, @NonNull Description> commandArguments, final @NonNull CommandExecutionHandler<@NonNull C> commandExecutionHandler, @@ -178,6 +184,7 @@ public class Command { * @see #Command(List, CommandExecutionHandler, Class, CommandMeta) */ @Deprecated + @API(status = API.Status.DEPRECATED) public Command( final @NonNull Map<@NonNull CommandArgument, @NonNull Description> commandArguments, final @NonNull CommandExecutionHandler<@NonNull C> commandExecutionHandler, @@ -198,6 +205,7 @@ public class Command { * @see #Command(List, CommandExecutionHandler, CommandPermission, CommandMeta) */ @Deprecated + @API(status = API.Status.DEPRECATED) public Command( final @NonNull Map<@NonNull CommandArgument, @NonNull Description> commandArguments, final @NonNull CommandExecutionHandler<@NonNull C> commandExecutionHandler, @@ -231,6 +239,7 @@ public class Command { * @deprecated for removal since 1.4.0. Use {@link #newBuilder(String, CommandMeta, ArgumentDescription, String...)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public static @NonNull Builder newBuilder( final @NonNull String commandName, final @NonNull CommandMeta commandMeta, @@ -252,6 +261,7 @@ public class Command { * @return Command builder * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public static @NonNull Builder newBuilder( final @NonNull String commandName, final @NonNull CommandMeta commandMeta, @@ -314,6 +324,7 @@ public class Command { * @return Copy of the command component array. This List is mutable * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public @NonNull List> getComponents() { return new ArrayList<>(this.components); } @@ -364,6 +375,7 @@ public class Command { * Use {@link #getArguments()} and search in that, instead. */ @Deprecated + @API(status = API.Status.DEPRECATED) public @NonNull String getArgumentDescription(final @NonNull CommandArgument argument) { for (final CommandComponent component : this.components) { if (component.getArgument().equals(argument)) { @@ -384,7 +396,7 @@ public class Command { } /** - * Check whether or not the command is hidden + * Check whether the command is hidden * * @return {@code true} if the command is hidden, {@code false} if not */ @@ -399,6 +411,7 @@ public class Command { * * @param Command sender type */ + @API(status = API.Status.STABLE) public static final class Builder { private final CommandMeta commandMeta; @@ -435,6 +448,7 @@ public class Command { * @return required sender type * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public @Nullable Class senderType() { return this.senderType; } @@ -447,6 +461,7 @@ public class Command { * @return required permission * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public @NonNull CommandPermission commandPermission() { return this.commandPermission; } @@ -460,6 +475,7 @@ public class Command { * @deprecated for removal since 1.2.0, use the typesafe variant at {@link #meta(CommandMeta.Key, Object)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.2.0") public @NonNull Builder meta(final @NonNull String key, final @NonNull String value) { final CommandMeta commandMeta = SimpleCommandMeta.builder().with(this.commandMeta).with(key, value).build(); return new Builder<>( @@ -482,6 +498,7 @@ public class Command { * @return New builder instance using the inserted meta key-value pair * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public @NonNull Builder meta(final CommandMeta.@NonNull Key key, final @NonNull V value) { final CommandMeta commandMeta = SimpleCommandMeta.builder().with(this.commandMeta).with(key, value).build(); return new Builder<>( @@ -539,6 +556,7 @@ public class Command { * @deprecated for removal since 1.4.0. Use {@link #literal(String, ArgumentDescription, String...)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public @NonNull Builder literal( final @NonNull String main, final @NonNull Description description, @@ -556,6 +574,7 @@ public class Command { * @return New builder instance with the modified command chain * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull Builder literal( final @NonNull String main, final @NonNull ArgumentDescription description, @@ -597,6 +616,7 @@ public class Command { * @deprecated for removal since 1.4.0. Use {@link #argument(CommandArgument, ArgumentDescription)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public @NonNull Builder argument( final @NonNull CommandArgument argument, final @NonNull Description description @@ -613,6 +633,7 @@ public class Command { * @return New builder instance with the command argument inserted into the argument list * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull Builder argument( final @NonNull CommandArgument argument, final @NonNull ArgumentDescription description @@ -646,6 +667,7 @@ public class Command { * @deprecated for removal since 1.4.0. Use {@link #argument(CommandArgument.Builder, ArgumentDescription)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public @NonNull Builder argument( final CommandArgument.@NonNull Builder builder, final @NonNull Description description @@ -663,6 +685,7 @@ public class Command { * @return New builder instance with the command argument inserted into the argument list * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull Builder argument( final CommandArgument.@NonNull Builder builder, final @NonNull ArgumentDescription description @@ -723,6 +746,7 @@ public class Command { * @deprecated for removal since 1.4.0. Use {@link #argumentPair(String, Pair, Pair, ArgumentDescription)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public @NonNull Builder argumentPair( final @NonNull String name, final @NonNull Pair<@NonNull String, @NonNull String> names, @@ -750,6 +774,7 @@ public class Command { * @return Builder instance with the argument inserted * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull Builder argumentPair( final @NonNull String name, final @NonNull Pair<@NonNull String, @NonNull String> names, @@ -785,6 +810,7 @@ public class Command { * {@link #argumentPair(String, TypeToken, Pair, Pair, BiFunction, ArgumentDescription)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public @NonNull Builder argumentPair( final @NonNull String name, final @NonNull TypeToken outputType, @@ -817,6 +843,7 @@ public class Command { * @return Builder instance with the argument inserted * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull Builder argumentPair( final @NonNull String name, final @NonNull TypeToken outputType, @@ -855,6 +882,7 @@ public class Command { * instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public @NonNull Builder argumentTriplet( final @NonNull String name, final @NonNull Triplet names, @@ -883,6 +911,7 @@ public class Command { * @return Builder instance with the argument inserted * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull Builder argumentTriplet( final @NonNull String name, final @NonNull Triplet names, @@ -919,6 +948,7 @@ public class Command { * {@link #argumentTriplet(String, TypeToken, Triplet, Triplet, BiFunction, ArgumentDescription)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public @NonNull Builder argumentTriplet( final @NonNull String name, final @NonNull TypeToken outputType, @@ -959,6 +989,7 @@ public class Command { * @return Builder instance with the argument inserted * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull Builder argumentTriplet( final @NonNull String name, final @NonNull TypeToken outputType, @@ -1002,6 +1033,7 @@ public class Command { * @return the current handler * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") public @NonNull CommandExecutionHandler handler() { return this.commandExecutionHandler; } diff --git a/cloud-core/src/main/java/cloud/commandframework/CommandComponent.java b/cloud-core/src/main/java/cloud/commandframework/CommandComponent.java index 3926dfa6..c2581512 100644 --- a/cloud-core/src/main/java/cloud/commandframework/CommandComponent.java +++ b/cloud-core/src/main/java/cloud/commandframework/CommandComponent.java @@ -25,6 +25,7 @@ package cloud.commandframework; import cloud.commandframework.arguments.CommandArgument; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -33,6 +34,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param Command sender type * @since 1.3.0 */ +@API(status = API.Status.STABLE, since = "1.3.0") public final class CommandComponent { private final CommandArgument argument; @@ -68,6 +70,7 @@ public final class CommandComponent { * @deprecated for removal since 1.4.0. Use {@link #getArgumentDescription()} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public @NonNull Description getDescription() { if (this.description instanceof Description) { return (Description) this.description; @@ -82,6 +85,7 @@ public final class CommandComponent { * @return command component description * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull ArgumentDescription getArgumentDescription() { return this.description; } @@ -120,6 +124,7 @@ public final class CommandComponent { * @deprecated for removal since 1.4.0. Use {@link #of(CommandArgument, ArgumentDescription)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public static @NonNull CommandComponent of( final @NonNull CommandArgument commandArgument, final @NonNull Description commandDescription diff --git a/cloud-core/src/main/java/cloud/commandframework/CommandHelpHandler.java b/cloud-core/src/main/java/cloud/commandframework/CommandHelpHandler.java index 2a405799..7d05d775 100644 --- a/cloud-core/src/main/java/cloud/commandframework/CommandHelpHandler.java +++ b/cloud-core/src/main/java/cloud/commandframework/CommandHelpHandler.java @@ -36,9 +36,11 @@ import java.util.Locale; import java.util.Objects; import java.util.Set; import java.util.function.Predicate; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +@API(status = API.Status.STABLE) public final class CommandHelpHandler { private final CommandManager commandManager; @@ -289,6 +291,7 @@ public final class CommandHelpHandler { return false; } + /** * Something that can be returned as the result of a help query *

@@ -301,10 +304,13 @@ public final class CommandHelpHandler { * * @param Command sender type */ + @API(status = API.Status.STABLE) public interface HelpTopic { } + + @API(status = API.Status.STABLE) public static final class VerboseHelpEntry { private final Command command; @@ -378,11 +384,13 @@ public final class CommandHelpHandler { } + /** * Index of available commands * * @param Command sender type */ + @API(status = API.Status.STABLE) public static final class IndexHelpTopic implements HelpTopic { private final List> entries; @@ -441,6 +449,7 @@ public final class CommandHelpHandler { * * @param Command sender type */ + @API(status = API.Status.STABLE) public static final class VerboseHelpTopic implements HelpTopic { private final Command command; @@ -503,6 +512,7 @@ public final class CommandHelpHandler { * * @param Command sender type */ + @API(status = API.Status.STABLE) public static final class MultiHelpTopic implements HelpTopic { private final String longestPath; diff --git a/cloud-core/src/main/java/cloud/commandframework/CommandManager.java b/cloud-core/src/main/java/cloud/commandframework/CommandManager.java index c0ab371e..b72eebf3 100644 --- a/cloud-core/src/main/java/cloud/commandframework/CommandManager.java +++ b/cloud-core/src/main/java/cloud/commandframework/CommandManager.java @@ -75,6 +75,7 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.function.BiConsumer; import java.util.function.Function; import java.util.function.Predicate; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.returnsreceiver.qual.This; @@ -84,6 +85,7 @@ import org.checkerframework.common.returnsreceiver.qual.This; * * @param Command sender type */ +@API(status = API.Status.STABLE) public abstract class CommandManager { private final Map, BiConsumer> exceptionHandlers = new HashMap<>(); @@ -250,6 +252,7 @@ public abstract class CommandManager { * @return the caption variable replacement handler * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") public @NonNull CaptionVariableReplacementHandler captionVariableReplacementHandler() { return this.captionVariableReplacementHandler; } @@ -260,6 +263,7 @@ public abstract class CommandManager { * @param captionVariableReplacementHandler new replacement handler * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") public void captionVariableReplacementHandler( final @NonNull CaptionVariableReplacementHandler captionVariableReplacementHandler ) { @@ -363,6 +367,7 @@ public abstract class CommandManager { * @deprecated Use {@link #setCaptionRegistry(CaptionRegistry)} These methods are identical. */ @Deprecated + @API(status = API.Status.DEPRECATED) public final void registerDefaultCaptions(final @NonNull CaptionRegistry captionRegistry) { this.captionRegistry = captionRegistry; } @@ -392,9 +397,11 @@ public abstract class CommandManager { * @param description Description for the root literal * @param meta Command meta * @return Builder instance - * @deprecated for removal since 1.4.0. Use {@link #commandBuilder(String, Collection, Description, CommandMeta)} instead. + * @deprecated for removal since 1.4.0. Use + * {@link #commandBuilder(String, Collection, ArgumentDescription, CommandMeta)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public Command.@NonNull Builder commandBuilder( final @NonNull String name, final @NonNull Collection aliases, @@ -421,6 +428,7 @@ public abstract class CommandManager { * @return Builder instance * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public Command.@NonNull Builder commandBuilder( final @NonNull String name, final @NonNull Collection aliases, @@ -484,6 +492,7 @@ public abstract class CommandManager { * instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public Command.@NonNull Builder commandBuilder( final @NonNull String name, final @NonNull CommandMeta meta, @@ -510,6 +519,7 @@ public abstract class CommandManager { * @return Builder instance * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public Command.@NonNull Builder commandBuilder( final @NonNull String name, final @NonNull CommandMeta meta, @@ -575,6 +585,7 @@ public abstract class CommandManager { * @deprecated for removal since 1.4.0. Use {@link #commandBuilder(String, ArgumentDescription, String...)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public Command.@NonNull Builder commandBuilder( final @NonNull String name, final @NonNull Description description, @@ -603,6 +614,7 @@ public abstract class CommandManager { * @see #createDefaultCommandMeta() Default command meta creation * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public Command.@NonNull Builder commandBuilder( final @NonNull String name, final @NonNull ArgumentDescription description, @@ -943,6 +955,7 @@ public abstract class CommandManager { * @return Command execution coordinator * @since 1.6.0 */ + @API(status = API.Status.STABLE, since = "1.6.0") public @NonNull CommandExecutionCoordinator commandExecutionCoordinator() { return this.commandExecutionCoordinator; } @@ -955,6 +968,7 @@ public abstract class CommandManager { * @throws IllegalStateException if the manager is in any state but {@code in} or {@code out} * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") protected final void transitionOrThrow(final @NonNull RegistrationState in, final @NonNull RegistrationState out) { if (!this.transitionIfPossible(in, out)) { throw new IllegalStateException("Command manager was in state " + this.state.get() + ", while we were expecting a state " @@ -970,6 +984,7 @@ public abstract class CommandManager { * @return {@code true} if the state transition was successful, or the manager was already in the desired state * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") protected final boolean transitionIfPossible(final @NonNull RegistrationState in, final @NonNull RegistrationState out) { return this.state.compareAndSet(in, out) || this.state.get() == out; } @@ -981,6 +996,7 @@ public abstract class CommandManager { * @throws IllegalStateException if the manager is not in the expected state * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") protected final void requireState(final @NonNull RegistrationState expected) { if (this.state.get() != expected) { throw new IllegalStateException("This operation required the commands manager to be in state " + expected + ", but it " @@ -995,6 +1011,7 @@ public abstract class CommandManager { * @throws IllegalStateException if the manager is not in the expected state * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") protected final void lockRegistration() { if (this.getRegistrationState() == RegistrationState.BEFORE_REGISTRATION) { this.transitionOrThrow(RegistrationState.BEFORE_REGISTRATION, RegistrationState.AFTER_REGISTRATION); @@ -1011,6 +1028,7 @@ public abstract class CommandManager { * @return The current state * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") public final @NonNull RegistrationState getRegistrationState() { return this.state.get(); } @@ -1024,16 +1042,19 @@ public abstract class CommandManager { * @return {@code true} if the registration is allowed, else {@code false} * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") public boolean isCommandRegistrationAllowed() { return this.getSetting(ManagerSettings.ALLOW_UNSAFE_REGISTRATION) || this.state.get() != RegistrationState.AFTER_REGISTRATION; } + /** * Configurable command related settings * * @see CommandManager#setSetting(ManagerSettings, boolean) Set a manager setting * @see CommandManager#getSetting(ManagerSettings) Get a manager setting */ + @API(status = API.Status.STABLE) public enum ManagerSettings { /** * Do not create a compound permission and do not look greedily @@ -1057,6 +1078,7 @@ public abstract class CommandManager { * * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") ALLOW_UNSAFE_REGISTRATION, /** @@ -1064,14 +1086,17 @@ public abstract class CommandManager { * * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") OVERRIDE_EXISTING_COMMANDS } + /** * The point in the registration lifecycle for this commands manager * * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") public enum RegistrationState { /** * The point when no commands have been registered yet. diff --git a/cloud-core/src/main/java/cloud/commandframework/CommandTree.java b/cloud-core/src/main/java/cloud/commandframework/CommandTree.java index 06cd7a89..2dce8b0f 100644 --- a/cloud-core/src/main/java/cloud/commandframework/CommandTree.java +++ b/cloud-core/src/main/java/cloud/commandframework/CommandTree.java @@ -60,6 +60,7 @@ import java.util.Queue; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -90,6 +91,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * * @param Command sender type */ +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public final class CommandTree { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/Description.java b/cloud-core/src/main/java/cloud/commandframework/Description.java index 2bc7fd61..4c954b7c 100644 --- a/cloud-core/src/main/java/cloud/commandframework/Description.java +++ b/cloud-core/src/main/java/cloud/commandframework/Description.java @@ -24,6 +24,7 @@ package cloud.commandframework; import cloud.commandframework.arguments.CommandArgument; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @deprecated to become package-private since 1.4.0. Use {@link ArgumentDescription} instead. */ @Deprecated +@API(status = API.Status.DEPRECATED, since = "1.4.0") public final class Description implements ArgumentDescription { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/LockableCommandManager.java b/cloud-core/src/main/java/cloud/commandframework/LockableCommandManager.java index 4df27475..a4858260 100644 --- a/cloud-core/src/main/java/cloud/commandframework/LockableCommandManager.java +++ b/cloud-core/src/main/java/cloud/commandframework/LockableCommandManager.java @@ -27,6 +27,7 @@ import cloud.commandframework.execution.AsynchronousCommandExecutionCoordinator; import cloud.commandframework.execution.CommandExecutionCoordinator; import cloud.commandframework.internal.CommandRegistrationHandler; import java.util.function.Function; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -42,6 +43,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @deprecated Use a normal {@link CommandManager}'s registration state instead */ @Deprecated +@API(status = API.Status.DEPRECATED, since = "1.2.0") public abstract class LockableCommandManager extends CommandManager { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/AnnotatedElementAccessor.java b/cloud-core/src/main/java/cloud/commandframework/annotations/AnnotatedElementAccessor.java index 5a34d79b..0cee8fbc 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/AnnotatedElementAccessor.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/AnnotatedElementAccessor.java @@ -29,9 +29,11 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") final class AnnotatedElementAccessor implements AnnotationAccessor { private final AnnotatedElement element; diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/AnnotationAccessor.java b/cloud-core/src/main/java/cloud/commandframework/annotations/AnnotationAccessor.java index 0f914890..ce7633a1 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/AnnotationAccessor.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/AnnotationAccessor.java @@ -27,6 +27,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.AnnotatedElement; import java.util.Collection; import java.util.Collections; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -35,6 +36,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * * @since 1.2.0 */ +@API(status = API.Status.STABLE, since = "1.2.0") public interface AnnotationAccessor { /** @@ -43,6 +45,7 @@ public interface AnnotationAccessor { * @return Empty annotation accessor * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") static @NonNull AnnotationAccessor empty() { return new NullAnnotationAccessor(); } @@ -67,6 +70,7 @@ public interface AnnotationAccessor { * @return Annotation accessor that delegates to the given accessors (using their natural ordering) * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") static @NonNull AnnotationAccessor of(final @NonNull AnnotationAccessor@NonNull... accessors) { return new MultiDelegateAnnotationAccessor(accessors); } @@ -95,6 +99,7 @@ public interface AnnotationAccessor { * * @since 1.3.0 */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*", since = "1.3.0") final class NullAnnotationAccessor implements AnnotationAccessor { @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/MultiDelegateAnnotationAccessor.java b/cloud-core/src/main/java/cloud/commandframework/annotations/MultiDelegateAnnotationAccessor.java index d5f9aeb7..790be4a7 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/MultiDelegateAnnotationAccessor.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/MultiDelegateAnnotationAccessor.java @@ -28,9 +28,11 @@ import java.util.Collection; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") final class MultiDelegateAnnotationAccessor implements AnnotationAccessor { private final AnnotationAccessor[] accessors; diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/injection/GuiceInjectionService.java b/cloud-core/src/main/java/cloud/commandframework/annotations/injection/GuiceInjectionService.java index 4e8c5797..c6be597b 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/injection/GuiceInjectionService.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/injection/GuiceInjectionService.java @@ -28,6 +28,7 @@ import cloud.commandframework.context.CommandContext; import cloud.commandframework.types.tuples.Triplet; import com.google.inject.ConfigurationException; import com.google.inject.Injector; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -37,6 +38,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * @param Command sender type * @since 1.4.0 */ +@API(status = API.Status.STABLE, since = "1.4.0") public final class GuiceInjectionService implements InjectionService { private final Injector injector; diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/injection/InjectionService.java b/cloud-core/src/main/java/cloud/commandframework/annotations/injection/InjectionService.java index 197962f1..87007c5e 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/injection/InjectionService.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/injection/InjectionService.java @@ -27,6 +27,7 @@ import cloud.commandframework.annotations.AnnotationAccessor; import cloud.commandframework.context.CommandContext; import cloud.commandframework.services.types.Service; import cloud.commandframework.types.tuples.Triplet; +import org.apiguardian.api.API; /** * Service that can be registered to the {@link ParameterInjectorRegistry} in order to provide @@ -37,6 +38,7 @@ import cloud.commandframework.types.tuples.Triplet; * @since 1.4.0 */ @FunctionalInterface +@API(status = API.Status.STABLE, since = "1.4.0") public interface InjectionService extends Service, Class, AnnotationAccessor>, Object> { diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/injection/ParameterInjector.java b/cloud-core/src/main/java/cloud/commandframework/annotations/injection/ParameterInjector.java index 88ea614e..49249abf 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/injection/ParameterInjector.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/injection/ParameterInjector.java @@ -25,6 +25,7 @@ package cloud.commandframework.annotations.injection; import cloud.commandframework.annotations.AnnotationAccessor; import cloud.commandframework.context.CommandContext; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -37,6 +38,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * @since 1.2.0 */ @FunctionalInterface +@API(status = API.Status.STABLE, since = "1.2.0") public interface ParameterInjector { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/injection/ParameterInjectorRegistry.java b/cloud-core/src/main/java/cloud/commandframework/annotations/injection/ParameterInjectorRegistry.java index 0e457a69..4977fa2f 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/injection/ParameterInjectorRegistry.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/injection/ParameterInjectorRegistry.java @@ -36,6 +36,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Optional; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -46,6 +47,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * @since 1.2.0 */ @SuppressWarnings("ALL") +@API(status = API.Status.STABLE, since = "1.2.0") public final class ParameterInjectorRegistry implements InjectionService { private volatile int injectorCount = 0; @@ -124,6 +126,7 @@ public final class ParameterInjectorRegistry implements InjectionService { * @since 1.4.0 */ @SuppressWarnings("EmptyCatch") + @API(status = API.Status.STABLE, since = "1.4.0") public <@NonNull T> @NonNull Optional getInjectable( final @NonNull Class clazz, final @NonNull CommandContext context, @@ -145,6 +148,7 @@ public final class ParameterInjectorRegistry implements InjectionService { * @param service Service implementation * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public void registerInjectionService(final InjectionService service) { this.servicePipeline.registerServiceImplementation(new TypeToken>() { }, service, Collections.emptyList()); diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Completions.java b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Completions.java index 1566b6db..433f1133 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Completions.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Completions.java @@ -28,12 +28,14 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.apiguardian.api.API; /** * Command completions, separated by "," or ", " */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) +@API(status = API.Status.STABLE) public @interface Completions { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/FlagYielding.java b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/FlagYielding.java index 64da0fbc..c3001567 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/FlagYielding.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/FlagYielding.java @@ -27,6 +27,7 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.apiguardian.api.API; /** * Indicates that the argument should stop parsing when encountering what @@ -38,6 +39,7 @@ import java.lang.annotation.Target; */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) +@API(status = API.Status.STABLE, since = "1.7.0") public @interface FlagYielding { } diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Greedy.java b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Greedy.java index a67a9e3c..79b690f0 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Greedy.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Greedy.java @@ -27,12 +27,14 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.apiguardian.api.API; /** * Annotation used to make {@link cloud.commandframework.arguments.standard.StringArgument string arguments} greedy */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) +@API(status = API.Status.STABLE) public @interface Greedy { } diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Liberal.java b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Liberal.java index 6591323a..a28b64f3 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Liberal.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Liberal.java @@ -27,6 +27,7 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.apiguardian.api.API; /** * Annotation used to set the parsing mode of a {@link cloud.commandframework.arguments.standard.BooleanArgument boolean @@ -36,6 +37,7 @@ import java.lang.annotation.Target; */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) +@API(status = API.Status.STABLE, since = "1.6.0") public @interface Liberal { } diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Quoted.java b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Quoted.java index 6faad716..83f75a95 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Quoted.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Quoted.java @@ -27,6 +27,7 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.apiguardian.api.API; /** * Annotation used to set the parsing mode of a {@link cloud.commandframework.arguments.standard.StringArgument string @@ -36,6 +37,7 @@ import java.lang.annotation.Target; */ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) +@API(status = API.Status.STABLE, since = "1.5.0") public @interface Quoted { } diff --git a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Range.java b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Range.java index 275e9de4..3c098024 100644 --- a/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Range.java +++ b/cloud-core/src/main/java/cloud/commandframework/annotations/specifier/Range.java @@ -28,6 +28,7 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -36,6 +37,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.PARAMETER) +@API(status = API.Status.STABLE) public @interface Range { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/CommandArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/CommandArgument.java index fb18fac0..0713a4e6 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/CommandArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/CommandArgument.java @@ -42,6 +42,7 @@ import java.util.Objects; import java.util.Queue; import java.util.function.BiFunction; import java.util.regex.Pattern; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.returnsreceiver.qual.This; @@ -53,6 +54,7 @@ import org.checkerframework.common.returnsreceiver.qual.This; * @param The type that the argument parses into */ @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public class CommandArgument implements Comparable>, CloudKeyHolder { /** @@ -126,6 +128,7 @@ public class CommandArgument implements Comparable>, * @param argumentPreprocessors Argument preprocessors * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public CommandArgument( final boolean required, final @NonNull String name, @@ -219,6 +222,7 @@ public class CommandArgument implements Comparable>, * @param defaultDescription Default description to use when registering * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public CommandArgument( final boolean required, final @NonNull String name, @@ -265,6 +269,7 @@ public class CommandArgument implements Comparable>, * @param defaultDescription Default description to use when registering * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public CommandArgument( final boolean required, final @NonNull String name, @@ -281,7 +286,7 @@ public class CommandArgument implements Comparable>, /** * Construct a new command argument * - * @param required Whether or not the argument is required + * @param required Whether the argument is required * @param name The argument name * @param parser The argument parser * @param valueType Type produced by the parser @@ -417,8 +422,7 @@ public class CommandArgument implements Comparable>, * * @return Owning command */ - @Nullable - public Command getOwningCommand() { + public @Nullable Command getOwningCommand() { return this.owningCommand; } @@ -537,7 +541,7 @@ public class CommandArgument implements Comparable>, } /** - * Check whether or not the argument has been used in a command + * Check whether the argument has been used in a command * * @return {@code true} if the argument has been used in a command, else {@code false} */ @@ -559,6 +563,7 @@ public class CommandArgument implements Comparable>, * @param Command sender type * @param Argument value type */ + @API(status = API.Status.STABLE) public static class Builder { private final TypeToken valueType; @@ -679,6 +684,7 @@ public class CommandArgument implements Comparable>, * @return Builder instance * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull @This Builder<@NonNull C, @NonNull T> withDefaultDescription( final @NonNull ArgumentDescription defaultDescription ) { @@ -753,6 +759,7 @@ public class CommandArgument implements Comparable>, * @param the subclass type * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public abstract static class TypedBuilder> extends Builder { protected TypedBuilder( diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/CommandSuggestionEngine.java b/cloud-core/src/main/java/cloud/commandframework/arguments/CommandSuggestionEngine.java index 992ab8a8..7db8be5f 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/CommandSuggestionEngine.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/CommandSuggestionEngine.java @@ -25,6 +25,7 @@ package cloud.commandframework.arguments; import cloud.commandframework.context.CommandContext; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public interface CommandSuggestionEngine { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/CommandSyntaxFormatter.java b/cloud-core/src/main/java/cloud/commandframework/arguments/CommandSyntaxFormatter.java index 3218faf9..8141aadd 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/CommandSyntaxFormatter.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/CommandSyntaxFormatter.java @@ -25,6 +25,7 @@ package cloud.commandframework.arguments; import cloud.commandframework.CommandTree; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -34,6 +35,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * @param Command sender type */ @FunctionalInterface +@API(status = API.Status.STABLE) public interface CommandSyntaxFormatter { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingCommandSuggestionEngine.java b/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingCommandSuggestionEngine.java index 4c964a6f..6063724d 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingCommandSuggestionEngine.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingCommandSuggestionEngine.java @@ -32,6 +32,7 @@ import cloud.commandframework.services.State; import java.util.Collections; import java.util.LinkedList; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -39,6 +40,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public final class DelegatingCommandSuggestionEngine implements CommandSuggestionEngine { private static final List SINGLE_EMPTY_SUGGESTION = Collections.unmodifiableList(Collections.singletonList("")); diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingCommandSuggestionEngineFactory.java b/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingCommandSuggestionEngineFactory.java index d3087e37..5608d758 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingCommandSuggestionEngineFactory.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingCommandSuggestionEngineFactory.java @@ -25,6 +25,7 @@ package cloud.commandframework.arguments; import cloud.commandframework.CommandManager; import cloud.commandframework.CommandTree; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public final class DelegatingCommandSuggestionEngineFactory { private final CommandManager commandManager; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingSuggestionsProvider.java b/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingSuggestionsProvider.java index 6b732d81..b02fa769 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingSuggestionsProvider.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/DelegatingSuggestionsProvider.java @@ -27,8 +27,10 @@ import cloud.commandframework.arguments.parser.ArgumentParser; import cloud.commandframework.context.CommandContext; import java.util.List; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") final class DelegatingSuggestionsProvider implements BiFunction<@NonNull CommandContext, @NonNull String, @NonNull List> { diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/StandardCommandSyntaxFormatter.java b/cloud-core/src/main/java/cloud/commandframework/arguments/StandardCommandSyntaxFormatter.java index eab1b643..2a8acc38 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/StandardCommandSyntaxFormatter.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/StandardCommandSyntaxFormatter.java @@ -29,6 +29,7 @@ import cloud.commandframework.arguments.compound.FlagArgument; import cloud.commandframework.arguments.flags.CommandFlag; import java.util.Iterator; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -42,6 +43,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * * @param Command sender type */ +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public class StandardCommandSyntaxFormatter implements CommandSyntaxFormatter { /** @@ -132,6 +134,7 @@ public class StandardCommandSyntaxFormatter implements CommandSyntaxFormatter /** * Instance that is used when building command syntax */ + @API(status = API.Status.STABLE) public static class FormattingInstance { private final StringBuilder builder; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/StaticArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/StaticArgument.java index 267a3a9a..d920ccbe 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/StaticArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/StaticArgument.java @@ -35,6 +35,7 @@ import java.util.List; import java.util.Queue; import java.util.Set; import java.util.TreeSet; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -42,6 +43,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public final class StaticArgument extends CommandArgument { private StaticArgument(final boolean required, final @NonNull String name, final @NonNull String... aliases) { diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/compound/ArgumentPair.java b/cloud-core/src/main/java/cloud/commandframework/arguments/compound/ArgumentPair.java index c2b4e025..a7b6cdcc 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/compound/ArgumentPair.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/compound/ArgumentPair.java @@ -30,6 +30,7 @@ import cloud.commandframework.arguments.parser.ParserRegistry; import cloud.commandframework.types.tuples.Pair; import io.leangen.geantyref.TypeToken; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -40,6 +41,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param Second argument type * @param Output type */ +@API(status = API.Status.STABLE) public class ArgumentPair extends CompoundArgument, C, O> { /** @@ -104,7 +106,9 @@ public class ArgumentPair extends CompoundArgument, C, O> return new ArgumentPairIntermediaryBuilder<>(true, name, names, Pair.of(firstParser, secondaryParser), types); } + @SuppressWarnings("ALL") + @API(status = API.Status.STABLE) public static final class ArgumentPairIntermediaryBuilder { private final boolean required; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/compound/ArgumentTriplet.java b/cloud-core/src/main/java/cloud/commandframework/arguments/compound/ArgumentTriplet.java index 96ce7e77..34d93cc4 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/compound/ArgumentTriplet.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/compound/ArgumentTriplet.java @@ -30,6 +30,7 @@ import cloud.commandframework.arguments.parser.ParserRegistry; import cloud.commandframework.types.tuples.Triplet; import io.leangen.geantyref.TypeToken; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -41,6 +42,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param Third argument type * @param Output type */ +@API(status = API.Status.STABLE) public class ArgumentTriplet extends CompoundArgument, C, O> { /** @@ -115,7 +117,9 @@ public class ArgumentTriplet extends CompoundArgument { private final boolean required; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/compound/CompoundArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/compound/CompoundArgument.java index a03d6321..fca2884e 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/compound/CompoundArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/compound/CompoundArgument.java @@ -33,6 +33,7 @@ import java.util.List; import java.util.Queue; import java.util.function.BiFunction; import java.util.function.Function; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -42,6 +43,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param Command sender type * @param Output type */ +@API(status = API.Status.STABLE) public class CompoundArgument extends CommandArgument { private final Tuple types; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/compound/FlagArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/compound/FlagArgument.java index a5bd60b3..e4340dee 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/compound/FlagArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/compound/FlagArgument.java @@ -47,6 +47,7 @@ import java.util.Set; import java.util.function.BiFunction; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -55,6 +56,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public final class FlagArgument extends CommandArgument { private static final Pattern FLAG_PRIMARY_PATTERN = Pattern.compile(" --(?([A-Za-z]+))"); @@ -105,6 +107,7 @@ public final class FlagArgument extends CommandArgument { } + @API(status = API.Status.STABLE) public static final class FlagArgumentParser implements ArgumentParser { private final CommandFlag[] flags; @@ -289,6 +292,7 @@ public final class FlagArgument extends CommandArgument { return this.suggestions(commandContext, input); } + /** * Helper class to parse the command input queue into flags * and flag values. On failure the intermediate results @@ -472,9 +476,11 @@ public final class FlagArgument extends CommandArgument { } } + /** * Flag parse exception */ + @API(status = API.Status.STABLE) public static final class FlagParseException extends ParserException { private static final long serialVersionUID = -7725389394142868549L; @@ -513,9 +519,11 @@ public final class FlagArgument extends CommandArgument { } + /** * Reasons for which flag parsing may fail */ + @API(status = API.Status.STABLE) public enum FailureReason { UNKNOWN_FLAG(StandardCaptionKeys.ARGUMENT_PARSE_FAILURE_FLAG_UNKNOWN_FLAG), diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/flags/CommandFlag.java b/cloud-core/src/main/java/cloud/commandframework/arguments/flags/CommandFlag.java index 3a4ab9c1..a3965a67 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/flags/CommandFlag.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/flags/CommandFlag.java @@ -32,6 +32,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.Objects; import java.util.Set; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -43,6 +44,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * @param Command argument type. {@link Void} is used when no argument is present. */ @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class CommandFlag { private final @NonNull String name; @@ -101,6 +103,7 @@ public final class CommandFlag { * @deprecated for removal since 1.4.0. Use {@link #getArgumentDescription()} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public cloud.commandframework.@NonNull Description getDescription() { if (this.description instanceof cloud.commandframework.Description) { return ((cloud.commandframework.Description) this.description); @@ -115,6 +118,7 @@ public final class CommandFlag { * @return Flag description * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull ArgumentDescription getArgumentDescription() { return this.description; } @@ -134,6 +138,7 @@ public final class CommandFlag { * @return Command permission, or {@code null} * @since 1.6.0 */ + @API(status = API.Status.STABLE, since = "1.6.0") public CommandPermission permission() { return this.permission; } @@ -161,6 +166,7 @@ public final class CommandFlag { } + @API(status = API.Status.STABLE) public static final class Builder { private final String name; @@ -227,6 +233,7 @@ public final class CommandFlag { * @deprecated for removal since 1.4.0. Use {@link #withDescription(ArgumentDescription)} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.4.0") public Builder withDescription(final cloud.commandframework.@NonNull Description description) { return this.withDescription((ArgumentDescription) description); } @@ -238,6 +245,7 @@ public final class CommandFlag { * @return New builder instance * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public Builder withDescription(final @NonNull ArgumentDescription description) { return new Builder<>(this.name, this.aliases, description, this.permission, this.commandArgument); } @@ -271,6 +279,7 @@ public final class CommandFlag { * @return New builder instance * @since 1.6.0 */ + @API(status = API.Status.STABLE, since = "1.6.0") public Builder withPermission(final @NonNull CommandPermission permission) { return new Builder<>(this.name, this.aliases, this.description, permission, this.commandArgument); } diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/flags/FlagContext.java b/cloud-core/src/main/java/cloud/commandframework/arguments/flags/FlagContext.java index d20d5bf1..ea31c055 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/flags/FlagContext.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/flags/FlagContext.java @@ -26,12 +26,14 @@ package cloud.commandframework.arguments.flags; import java.util.HashMap; import java.util.Map; import java.util.Optional; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; /** * Flag value mappings */ +@API(status = API.Status.STABLE) public final class FlagContext { /** @@ -99,6 +101,7 @@ public final class FlagContext { * else {@code false} * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public boolean isPresent(final @NonNull CommandFlag flag) { return this.isPresent(flag.getName()); } @@ -111,6 +114,7 @@ public final class FlagContext { * @return Optional containing stored value if present * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") public @NonNull Optional getValue( final @NonNull String name ) { @@ -130,6 +134,7 @@ public final class FlagContext { * @return Optional containing stored value if present * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull Optional getValue( final @NonNull CommandFlag flag ) { @@ -160,6 +165,7 @@ public final class FlagContext { * @return Stored value, or the supplied default value * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @Nullable T getValue( final @NonNull CommandFlag name, final @Nullable T defaultValue @@ -176,6 +182,7 @@ public final class FlagContext { * @return whether the flag is present * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") public boolean hasFlag( final @NonNull String name ) { @@ -191,6 +198,7 @@ public final class FlagContext { * @return whether the flag is present * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public boolean hasFlag( final @NonNull CommandFlag flag ) { @@ -206,6 +214,7 @@ public final class FlagContext { * @return whether the flag is present * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public boolean contains(final @NonNull String name) { return this.hasFlag(name); } @@ -219,6 +228,7 @@ public final class FlagContext { * @return whether the flag is present * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public boolean contains(final @NonNull CommandFlag flag) { return this.hasFlag(flag); } @@ -232,6 +242,7 @@ public final class FlagContext { * @since 1.3.0 */ @SuppressWarnings("TypeParameterUnusedInFormals") + @API(status = API.Status.STABLE, since = "1.3.0") public @Nullable T get( final @NonNull String name ) { @@ -246,6 +257,7 @@ public final class FlagContext { * @return Stored value if present, else {@code null} * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @Nullable T get( final @NonNull CommandFlag flag ) { diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ArgumentParseResult.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ArgumentParseResult.java index 88277842..c4e9e408 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ArgumentParseResult.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ArgumentParseResult.java @@ -25,6 +25,7 @@ package cloud.commandframework.arguments.parser; import java.util.Optional; import java.util.function.Function; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.common.returnsreceiver.qual.This; @@ -33,6 +34,7 @@ import org.checkerframework.common.returnsreceiver.qual.This; * * @param Parser return type */ +@API(status = API.Status.STABLE) public abstract class ArgumentParseResult { private ArgumentParseResult() { @@ -75,6 +77,7 @@ public abstract class ArgumentParseResult { * @return a new result if successful, otherwise a failure * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public abstract @NonNull ArgumentParseResult mapParsedValue(Function mapper); /** @@ -85,6 +88,7 @@ public abstract class ArgumentParseResult { * @return a new result if successful, otherwise a failure * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public abstract @NonNull ArgumentParseResult flatMapParsedValue(Function> mapper); /** @@ -101,6 +105,7 @@ public abstract class ArgumentParseResult { * @return if this is a failure, a transformed result, otherwise this * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public abstract @NonNull ArgumentParseResult mapFailure(Function mapper); @@ -160,13 +165,13 @@ public abstract class ArgumentParseResult { @Override @SuppressWarnings("unchecked") - public @NonNull ArgumentParseResult mapParsedValue(final Function mapper) { + public @NonNull @This ArgumentParseResult mapParsedValue(final Function mapper) { return (ArgumentParseResult) this; } @Override @SuppressWarnings("unchecked") - public @NonNull ArgumentParseResult flatMapParsedValue(final Function> mapper) { + public @NonNull @This ArgumentParseResult flatMapParsedValue(final Function> mapper) { return (ArgumentParseResult) this; } diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ArgumentParser.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ArgumentParser.java index 1788f302..1181a0e3 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ArgumentParser.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ArgumentParser.java @@ -28,6 +28,7 @@ import java.util.Collections; import java.util.List; import java.util.Queue; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import static java.util.Objects.requireNonNull; @@ -39,6 +40,7 @@ import static java.util.Objects.requireNonNull; * @param Value type */ @FunctionalInterface +@API(status = API.Status.STABLE) public interface ArgumentParser { /** @@ -99,12 +101,13 @@ public interface ArgumentParser { * @return a derived parser. * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") default @NonNull ArgumentParser map(final BiFunction, T, ArgumentParseResult> mapper) { return new MappedArgumentParser<>(this, requireNonNull(mapper, "mapper")); } /** - * Check whether or not this argument parser is context free. A context free + * Check whether this argument parser is context free. A context free * parser will not use the provided command context, and so supports impromptu parsing * * @return {@code true} if the parser is context free, else {@code false} @@ -120,6 +123,7 @@ public interface ArgumentParser { * @return The number of arguments tha the parser expects * @since 1.1.0 */ + @API(status = API.Status.STABLE, since = "1.1.0") default int getRequestedArgumentCount() { return DEFAULT_ARGUMENT_COUNT; } diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/MappedArgumentParser.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/MappedArgumentParser.java index 330953b1..3d50da0e 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/MappedArgumentParser.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/MappedArgumentParser.java @@ -27,6 +27,7 @@ import cloud.commandframework.context.CommandContext; import java.util.List; import java.util.Queue; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -38,6 +39,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * @param mapped output type * @since 1.5.0 */ +@API(status = API.Status.STABLE, since = "1.5.0") public final class MappedArgumentParser implements ArgumentParser { private final ArgumentParser base; private final BiFunction, I, ArgumentParseResult> mapper; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameter.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameter.java index 37689416..4d9b870b 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameter.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameter.java @@ -25,6 +25,7 @@ package cloud.commandframework.arguments.parser; import io.leangen.geantyref.TypeToken; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Type required by the parameter */ +@API(status = API.Status.STABLE) public class ParserParameter { private final String key; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameters.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameters.java index a0eb393f..7ab2c672 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameters.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserParameters.java @@ -26,11 +26,13 @@ package cloud.commandframework.arguments.parser; import java.util.Collections; import java.util.HashMap; import java.util.Map; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * Collection of {@link ParserParameter parameter}-{@link Object object} pairs */ +@API(status = API.Status.STABLE) public final class ParserParameters { private final Map, Object> internalMap = new HashMap<>(); diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserRegistry.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserRegistry.java index 5534efe6..7e50171f 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserRegistry.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/ParserRegistry.java @@ -31,6 +31,7 @@ import java.util.List; import java.util.Optional; import java.util.function.BiFunction; import java.util.function.Function; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -40,6 +41,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public interface ParserRegistry { /** @@ -130,6 +132,7 @@ public interface ParserRegistry { * @see #getSuggestionProvider(String) Get a suggestion provider * @since 1.1.0 */ + @API(status = API.Status.STABLE, since = "1.1.0") void registerSuggestionProvider( @NonNull String name, @NonNull BiFunction<@NonNull CommandContext, @NonNull String, @NonNull List> suggestionsProvider @@ -144,6 +147,7 @@ public interface ParserRegistry { * @see #registerSuggestionProvider(String, BiFunction) Register a suggestion provider * @since 1.1.0 */ + @API(status = API.Status.STABLE, since = "1.1.0") @NonNull Optional, @NonNull String, @NonNull List>> getSuggestionProvider( @NonNull String name ); diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParameters.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParameters.java index 170cec8a..f5a16d89 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParameters.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParameters.java @@ -24,11 +24,13 @@ package cloud.commandframework.arguments.parser; import io.leangen.geantyref.TypeToken; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * Common parser parameters used when resolving types in the {@link ParserRegistry} */ +@API(status = API.Status.STABLE) public final class StandardParameters { /** @@ -65,6 +67,7 @@ public final class StandardParameters { * @since 1.7.0 * @see cloud.commandframework.annotations.specifier.FlagYielding */ + @API(status = API.Status.STABLE, since = "1.7.0") public static final ParserParameter FLAG_YIELDING = create( "flag_yielding", TypeToken.get(Boolean.class) @@ -74,12 +77,14 @@ public final class StandardParameters { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final ParserParameter QUOTED = create("quoted", TypeToken.get(Boolean.class)); /** * Indicates that a boolean argument should be liberal. * * @since 1.6.0 */ + @API(status = API.Status.STABLE, since = "1.6.0") public static final ParserParameter LIBERAL = create("liberal", TypeToken.get(Boolean.class)); private StandardParameters() { diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParserRegistry.java b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParserRegistry.java index cdf48ec8..18c1f14e 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParserRegistry.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/parser/StandardParserRegistry.java @@ -56,6 +56,7 @@ import java.util.Optional; import java.util.UUID; import java.util.function.BiFunction; import java.util.function.Function; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -64,6 +65,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param Command sender type */ @SuppressWarnings({"unused", "unchecked", "rawtypes"}) +@API(status = API.Status.STABLE) public final class StandardParserRegistry implements ParserRegistry { @SuppressWarnings({"DoubleBraceInitialization"}) diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/preprocessor/RegexPreprocessor.java b/cloud-core/src/main/java/cloud/commandframework/arguments/preprocessor/RegexPreprocessor.java index aa8b7bbf..2fea44f9 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/preprocessor/RegexPreprocessor.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/preprocessor/RegexPreprocessor.java @@ -33,6 +33,7 @@ import java.util.Queue; import java.util.function.BiFunction; import java.util.function.Predicate; import java.util.regex.Pattern; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -41,6 +42,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param Command sender type */ @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class RegexPreprocessor implements BiFunction<@NonNull CommandContext, @NonNull Queue<@NonNull String>, @NonNull ArgumentParseResult> { @@ -113,6 +115,7 @@ public final class RegexPreprocessor implements BiFunction<@NonNull CommandCo * Exception thrown when input fails regex matching in {@link RegexPreprocessor} */ @SuppressWarnings("serial") + @API(status = API.Status.STABLE) public static final class RegexValidationException extends IllegalArgumentException { private static final long serialVersionUID = 747826566058072233L; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/BooleanArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/BooleanArgument.java index 546c1fae..5764a43b 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/BooleanArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/BooleanArgument.java @@ -37,11 +37,13 @@ import java.util.List; import java.util.Objects; import java.util.Queue; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.returnsreceiver.qual.This; @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class BooleanArgument extends CommandArgument { private final boolean liberal; @@ -116,6 +118,8 @@ public final class BooleanArgument extends CommandArgument { return this.liberal; } + + @API(status = API.Status.STABLE) public static final class Builder extends CommandArgument.Builder { private boolean liberal = false; @@ -154,6 +158,8 @@ public final class BooleanArgument extends CommandArgument { } + + @API(status = API.Status.STABLE) public static final class BooleanParser implements ArgumentParser { private static final List LIBERAL = Arrays.asList("TRUE", "YES", "ON", "FALSE", "NO", "OFF"); @@ -236,6 +242,7 @@ public final class BooleanArgument extends CommandArgument { /** * Boolean parse exception */ + @API(status = API.Status.STABLE) public static final class BooleanParseException extends ParserException { private static final long serialVersionUID = -2688852086944850025L; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ByteArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ByteArgument.java index 810ecfcc..8b772db2 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ByteArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ByteArgument.java @@ -34,11 +34,13 @@ import java.util.List; import java.util.Objects; import java.util.Queue; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.returnsreceiver.qual.This; @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class ByteArgument extends CommandArgument { private final byte min; @@ -125,6 +127,8 @@ public final class ByteArgument extends CommandArgument { return this.max; } + + @API(status = API.Status.STABLE) public static final class Builder extends CommandArgument.Builder { private byte min = ByteParser.DEFAULT_MINIMUM; @@ -164,6 +168,7 @@ public final class ByteArgument extends CommandArgument { * @see CommandArgument.Builder#asOptionalWithDefault(String) * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public @NonNull Builder asOptionalWithDefault(final byte defaultValue) { return (Builder) this.asOptionalWithDefault(Byte.toString(defaultValue)); } @@ -182,6 +187,8 @@ public final class ByteArgument extends CommandArgument { } + + @API(status = API.Status.STABLE) public static final class ByteParser implements ArgumentParser { /** @@ -189,6 +196,7 @@ public final class ByteArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final byte DEFAULT_MINIMUM = Byte.MIN_VALUE; /** @@ -196,6 +204,7 @@ public final class ByteArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final byte DEFAULT_MAXIMUM = Byte.MAX_VALUE; private final byte min; @@ -271,6 +280,7 @@ public final class ByteArgument extends CommandArgument { * @return whether the parser has a maximum set * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public boolean hasMax() { return this.max != DEFAULT_MAXIMUM; } @@ -282,6 +292,7 @@ public final class ByteArgument extends CommandArgument { * @return whether the parser has a maximum set * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public boolean hasMin() { return this.min != DEFAULT_MINIMUM; } @@ -309,6 +320,7 @@ public final class ByteArgument extends CommandArgument { * @deprecated use {@link #ByteParseException(String, ByteParser, CommandContext)} instead */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.5.0") public ByteParseException( final @NonNull String input, final byte min, @@ -326,6 +338,7 @@ public final class ByteArgument extends CommandArgument { * @param context command context * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public ByteParseException( final @NonNull String input, final @NonNull ByteParser parser, diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/CharArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/CharArgument.java index 09828ac8..c2685fe9 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/CharArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/CharArgument.java @@ -36,10 +36,12 @@ import java.util.List; import java.util.Objects; import java.util.Queue; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class CharArgument extends CommandArgument { private CharArgument( @@ -102,6 +104,7 @@ public final class CharArgument extends CommandArgument { } + @API(status = API.Status.STABLE) public static final class Builder extends CommandArgument.Builder { private Builder(final @NonNull String name) { @@ -123,6 +126,7 @@ public final class CharArgument extends CommandArgument { } + @API(status = API.Status.STABLE) public static final class CharacterParser implements ArgumentParser { @Override @@ -157,6 +161,7 @@ public final class CharArgument extends CommandArgument { /** * Char parse exception */ + @API(status = API.Status.STABLE) public static final class CharParseException extends ParserException { private static final long serialVersionUID = 6458851071584278854L; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DoubleArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DoubleArgument.java index 3d8061d8..82160519 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DoubleArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DoubleArgument.java @@ -34,11 +34,13 @@ import java.util.List; import java.util.Objects; import java.util.Queue; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.returnsreceiver.qual.This; @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class DoubleArgument extends CommandArgument { private final double min; @@ -125,6 +127,8 @@ public final class DoubleArgument extends CommandArgument { return this.max; } + + @API(status = API.Status.STABLE) public static final class Builder extends CommandArgument.Builder { private double min = DoubleParser.DEFAULT_MINIMUM; @@ -164,6 +168,7 @@ public final class DoubleArgument extends CommandArgument { * @see CommandArgument.Builder#asOptionalWithDefault(String) * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public @NonNull Builder asOptionalWithDefault(final double defaultValue) { return (Builder) this.asOptionalWithDefault(Double.toString(defaultValue)); } @@ -182,6 +187,8 @@ public final class DoubleArgument extends CommandArgument { } + + @API(status = API.Status.STABLE) public static final class DoubleParser implements ArgumentParser { /** @@ -189,6 +196,7 @@ public final class DoubleArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final double DEFAULT_MINIMUM = Double.NEGATIVE_INFINITY; /** @@ -196,6 +204,7 @@ public final class DoubleArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final double DEFAULT_MAXIMUM = Double.POSITIVE_INFINITY; private final double min; @@ -282,6 +291,7 @@ public final class DoubleArgument extends CommandArgument { @SuppressWarnings("serial") + @API(status = API.Status.STABLE) public static final class DoubleParseException extends NumberParseException { private static final long serialVersionUID = 1764554911581976586L; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DurationArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DurationArgument.java index b8cb43d2..94b4c08a 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DurationArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/DurationArgument.java @@ -43,6 +43,7 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; import java.util.stream.IntStream; import java.util.stream.Stream; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -52,6 +53,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * @param sender type * @since 1.7.0 */ +@API(status = API.Status.STABLE, since = "1.7.0") public final class DurationArgument extends CommandArgument { /** @@ -153,6 +155,7 @@ public final class DurationArgument extends CommandArgument { * @param sender type * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") public static final class Builder extends TypedBuilder> { private Builder(final @NonNull String name) { @@ -197,6 +200,7 @@ public final class DurationArgument extends CommandArgument { * @param sender type * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") public static final class Parser implements ArgumentParser { @Override @@ -281,6 +285,7 @@ public final class DurationArgument extends CommandArgument { * * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") public static final class DurationParseException extends ParserException { private static final long serialVersionUID = 7632293268451349508L; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/EnumArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/EnumArgument.java index 7c3bdd81..79469253 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/EnumArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/EnumArgument.java @@ -38,6 +38,7 @@ import java.util.Objects; import java.util.Queue; import java.util.function.BiFunction; import java.util.stream.Collectors; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -48,6 +49,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * @param Enum type */ @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public class EnumArgument> extends CommandArgument { protected EnumArgument( @@ -129,6 +131,7 @@ public class EnumArgument> extends CommandArgument { } + @API(status = API.Status.STABLE) public static final class Builder> extends CommandArgument.Builder { private final Class enumClass; @@ -148,6 +151,7 @@ public class EnumArgument> extends CommandArgument { } + @API(status = API.Status.STABLE) public static final class EnumParser> implements ArgumentParser { private final Class enumClass; @@ -202,6 +206,7 @@ public class EnumArgument> extends CommandArgument { } + @API(status = API.Status.STABLE) public static final class EnumParseException extends ParserException { private static final long serialVersionUID = 3465389578951428862L; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/FloatArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/FloatArgument.java index 9159f86e..f53d74db 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/FloatArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/FloatArgument.java @@ -34,11 +34,13 @@ import java.util.List; import java.util.Objects; import java.util.Queue; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.returnsreceiver.qual.This; @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class FloatArgument extends CommandArgument { private final float min; @@ -125,6 +127,8 @@ public final class FloatArgument extends CommandArgument { return this.max; } + + @API(status = API.Status.STABLE) public static final class Builder extends CommandArgument.Builder { private float min = FloatParser.DEFAULT_MINIMUM; @@ -164,6 +168,7 @@ public final class FloatArgument extends CommandArgument { * @see CommandArgument.Builder#asOptionalWithDefault(String) * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public @NonNull Builder asOptionalWithDefault(final float defaultValue) { return (Builder) this.asOptionalWithDefault(Float.toString(defaultValue)); } @@ -177,6 +182,8 @@ public final class FloatArgument extends CommandArgument { } + + @API(status = API.Status.STABLE) public static final class FloatParser implements ArgumentParser { /** @@ -184,6 +191,7 @@ public final class FloatArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final float DEFAULT_MINIMUM = Float.NEGATIVE_INFINITY; /** @@ -191,6 +199,7 @@ public final class FloatArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final float DEFAULT_MAXIMUM = Float.POSITIVE_INFINITY; private final float min; @@ -258,6 +267,7 @@ public final class FloatArgument extends CommandArgument { * @return whether the parser has a maximum set * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public boolean hasMax() { return this.max != DEFAULT_MAXIMUM; } @@ -269,6 +279,7 @@ public final class FloatArgument extends CommandArgument { * @return whether the parser has a maximum set * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public boolean hasMin() { return this.min != DEFAULT_MINIMUM; } @@ -277,6 +288,7 @@ public final class FloatArgument extends CommandArgument { @SuppressWarnings("serial") + @API(status = API.Status.STABLE) public static final class FloatParseException extends NumberParseException { private static final long serialVersionUID = -1162983846751812292L; @@ -293,6 +305,7 @@ public final class FloatArgument extends CommandArgument { * @deprecated use {@link #FloatParseException(String, FloatParser, CommandContext)} instead */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.5.0") public FloatParseException( final @NonNull String input, final float min, @@ -310,6 +323,7 @@ public final class FloatArgument extends CommandArgument { * @param commandContext command context * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public FloatParseException( final @NonNull String input, final @NonNull FloatParser parser, diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java index e67b4787..1792ec75 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/IntegerArgument.java @@ -38,11 +38,13 @@ import java.util.Queue; import java.util.Set; import java.util.TreeSet; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.returnsreceiver.qual.This; @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class IntegerArgument extends CommandArgument { private static final int MAX_SUGGESTIONS_INCREMENT = 10; @@ -137,6 +139,8 @@ public final class IntegerArgument extends CommandArgument { return this.max; } + + @API(status = API.Status.STABLE) public static final class Builder extends CommandArgument.Builder { private int min = IntegerParser.DEFAULT_MINIMUM; @@ -176,6 +180,7 @@ public final class IntegerArgument extends CommandArgument { * @see CommandArgument.Builder#asOptionalWithDefault(String) * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public @NonNull Builder asOptionalWithDefault(final int defaultValue) { return (Builder) this.asOptionalWithDefault(Integer.toString(defaultValue)); } @@ -189,6 +194,8 @@ public final class IntegerArgument extends CommandArgument { } + + @API(status = API.Status.STABLE) public static final class IntegerParser implements ArgumentParser { /** @@ -196,6 +203,7 @@ public final class IntegerArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final int DEFAULT_MINIMUM = Integer.MIN_VALUE; /** @@ -203,6 +211,7 @@ public final class IntegerArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final int DEFAULT_MAXIMUM = Integer.MAX_VALUE; private final int min; @@ -340,6 +349,7 @@ public final class IntegerArgument extends CommandArgument { @SuppressWarnings("serial") + @API(status = API.Status.STABLE) public static final class IntegerParseException extends NumberParseException { private static final long serialVersionUID = -6933923056628373853L; @@ -356,6 +366,7 @@ public final class IntegerArgument extends CommandArgument { * @deprecated use {@link #IntegerParseException(String, IntegerParser, CommandContext)} instead */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.5.0") public IntegerParseException( final @NonNull String input, final int min, @@ -373,6 +384,7 @@ public final class IntegerArgument extends CommandArgument { * @param commandContext command context * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public IntegerParseException( final @NonNull String input, final @NonNull IntegerParser parser, diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/LongArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/LongArgument.java index 15f1ec9e..154f8e4b 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/LongArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/LongArgument.java @@ -34,11 +34,13 @@ import java.util.List; import java.util.Objects; import java.util.Queue; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.returnsreceiver.qual.This; @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class LongArgument extends CommandArgument { private final long min; @@ -125,6 +127,8 @@ public final class LongArgument extends CommandArgument { return this.max; } + + @API(status = API.Status.STABLE) public static final class Builder extends CommandArgument.Builder { private long min = LongParser.DEFAULT_MINIMUM; @@ -164,6 +168,7 @@ public final class LongArgument extends CommandArgument { * @see CommandArgument.Builder#asOptionalWithDefault(String) * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public @NonNull Builder asOptionalWithDefault(final long defaultValue) { return (Builder) this.asOptionalWithDefault(Long.toString(defaultValue)); } @@ -177,6 +182,8 @@ public final class LongArgument extends CommandArgument { } + + @API(status = API.Status.STABLE) public static final class LongParser implements ArgumentParser { /** @@ -184,6 +191,7 @@ public final class LongArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final long DEFAULT_MINIMUM = Long.MIN_VALUE; /** @@ -191,6 +199,7 @@ public final class LongArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final long DEFAULT_MAXIMUM = Long.MAX_VALUE; private final long min; @@ -253,6 +262,7 @@ public final class LongArgument extends CommandArgument { * @return whether the parser has a maximum set * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public boolean hasMax() { return this.max != DEFAULT_MAXIMUM; } @@ -264,6 +274,7 @@ public final class LongArgument extends CommandArgument { * @return whether the parser has a maximum set * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public boolean hasMin() { return this.min != DEFAULT_MINIMUM; } @@ -285,6 +296,7 @@ public final class LongArgument extends CommandArgument { @SuppressWarnings("serial") + @API(status = API.Status.STABLE) public static final class LongParseException extends NumberParseException { private static final long serialVersionUID = 4366856282301198232L; @@ -301,6 +313,7 @@ public final class LongArgument extends CommandArgument { * @deprecated use {@link #LongParseException(String, LongParser, CommandContext)} instead */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.5.0") public LongParseException( final @NonNull String input, final long min, @@ -318,6 +331,7 @@ public final class LongArgument extends CommandArgument { * @param commandContext command context * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public LongParseException( final @NonNull String input, final @NonNull LongParser parser, diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ShortArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ShortArgument.java index ea72edc5..26f6b886 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ShortArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/ShortArgument.java @@ -34,11 +34,13 @@ import java.util.List; import java.util.Objects; import java.util.Queue; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.returnsreceiver.qual.This; @SuppressWarnings("unused") +@API(status = API.Status.STABLE, since = "1.5.0") public final class ShortArgument extends CommandArgument { private final short min; @@ -122,6 +124,8 @@ public final class ShortArgument extends CommandArgument { return this.max; } + + @API(status = API.Status.STABLE) public static final class Builder extends CommandArgument.Builder { private short min = ShortParser.DEFAULT_MINIMUM; @@ -161,6 +165,7 @@ public final class ShortArgument extends CommandArgument { * @see CommandArgument.Builder#asOptionalWithDefault(String) * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public @NonNull Builder asOptionalWithDefault(final short defaultValue) { return (Builder) this.asOptionalWithDefault(Short.toString(defaultValue)); } @@ -174,6 +179,8 @@ public final class ShortArgument extends CommandArgument { } + + @API(status = API.Status.STABLE) public static final class ShortParser implements ArgumentParser { /** @@ -181,6 +188,7 @@ public final class ShortArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final short DEFAULT_MINIMUM = Short.MIN_VALUE; /** @@ -188,6 +196,7 @@ public final class ShortArgument extends CommandArgument { * * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public static final short DEFAULT_MAXIMUM = Short.MAX_VALUE; private final short min; @@ -263,6 +272,7 @@ public final class ShortArgument extends CommandArgument { * @return whether the parser has a maximum set * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public boolean hasMax() { return this.max != DEFAULT_MAXIMUM; } @@ -274,6 +284,7 @@ public final class ShortArgument extends CommandArgument { * @return whether the parser has a maximum set * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public boolean hasMin() { return this.min != DEFAULT_MINIMUM; } @@ -282,6 +293,7 @@ public final class ShortArgument extends CommandArgument { @SuppressWarnings("serial") + @API(status = API.Status.STABLE, since = "1.5.0") public static final class ShortParseException extends NumberParseException { private static final long serialVersionUID = -478674263339091032L; @@ -298,6 +310,7 @@ public final class ShortArgument extends CommandArgument { * @deprecated use {@link #ShortParseException(String, ShortParser, CommandContext)} instead */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.5.0") public ShortParseException( final @NonNull String input, final short min, @@ -315,6 +328,7 @@ public final class ShortArgument extends CommandArgument { * @param commandContext command context * @since 1.5.0 */ + @API(status = API.Status.STABLE, since = "1.5.0") public ShortParseException( final @NonNull String input, final @NonNull ShortParser parser, diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArgument.java index 0574f46c..6a8195ce 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArgument.java @@ -40,10 +40,12 @@ import java.util.StringJoiner; import java.util.function.BiFunction; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.common.returnsreceiver.qual.This; @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class StringArgument extends CommandArgument { private static final Pattern QUOTED_DOUBLE = Pattern.compile("\"(?(?:[^\"\\\\]|\\\\.)*)\""); @@ -174,6 +176,7 @@ public final class StringArgument extends CommandArgument { * @return Created argument * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") public static @NonNull CommandArgument greedyFlagYielding(final @NonNull String name) { return of(name, StringMode.GREEDY_FLAG_YIELDING); } @@ -199,6 +202,7 @@ public final class StringArgument extends CommandArgument { } + @API(status = API.Status.STABLE) public enum StringMode { SINGLE, QUOTED, @@ -208,10 +212,12 @@ public final class StringArgument extends CommandArgument { * * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") GREEDY_FLAG_YIELDING } + @API(status = API.Status.STABLE) public static final class Builder extends CommandArgument.Builder { private StringMode stringMode = StringMode.SINGLE; @@ -248,6 +254,7 @@ public final class StringArgument extends CommandArgument { * @return Builder instance * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") public @NonNull @This Builder greedyFlagYielding() { this.stringMode = StringMode.GREEDY_FLAG_YIELDING; return this; @@ -304,6 +311,7 @@ public final class StringArgument extends CommandArgument { @SuppressWarnings("UnnecessaryLambda") + @API(status = API.Status.STABLE) public static final class StringParser implements ArgumentParser { private static final Pattern FLAG_PATTERN = Pattern.compile("(-[A-Za-z_\\-0-9])|(--[A-Za-z_\\-0-9]*)"); @@ -461,6 +469,7 @@ public final class StringArgument extends CommandArgument { } + @API(status = API.Status.STABLE) public static final class StringParseException extends ParserException { private static final long serialVersionUID = -8903115465005472945L; diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArrayArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArrayArgument.java index 968d965b..812805a6 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArrayArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/StringArrayArgument.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Queue; import java.util.function.BiFunction; import java.util.regex.Pattern; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -44,6 +45,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * * @param Command sender type */ +@API(status = API.Status.STABLE) public final class StringArrayArgument extends CommandArgument { private StringArrayArgument( @@ -95,6 +97,7 @@ public final class StringArrayArgument extends CommandArgument { * @return Created argument * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") public static @NonNull StringArrayArgument of( final @NonNull String name, final boolean flagYielding, @@ -140,6 +143,7 @@ public final class StringArrayArgument extends CommandArgument { * @return Created argument * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") public static @NonNull StringArrayArgument optional( final @NonNull String name, final boolean flagYielding, @@ -160,6 +164,7 @@ public final class StringArrayArgument extends CommandArgument { * * @param Command sender type */ + @API(status = API.Status.STABLE) public static final class StringArrayParser implements ArgumentParser { private static final Pattern FLAG_PATTERN = Pattern.compile("(-[A-Za-z_\\-0-9])|(--[A-Za-z_\\-0-9]*)"); @@ -179,6 +184,7 @@ public final class StringArrayArgument extends CommandArgument { * @param flagYielding Whether the parser should stop parsing when encountering a potential flag * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") public StringArrayParser(final boolean flagYielding) { this.flagYielding = flagYielding; } diff --git a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/UUIDArgument.java b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/UUIDArgument.java index 9bd28fa2..ed57d182 100644 --- a/cloud-core/src/main/java/cloud/commandframework/arguments/standard/UUIDArgument.java +++ b/cloud-core/src/main/java/cloud/commandframework/arguments/standard/UUIDArgument.java @@ -37,10 +37,12 @@ import java.util.Objects; import java.util.Queue; import java.util.UUID; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class UUIDArgument extends CommandArgument { private UUIDArgument( @@ -103,6 +105,7 @@ public final class UUIDArgument extends CommandArgument { } + @API(status = API.Status.STABLE) public static final class Builder extends CommandArgument.Builder { private Builder(final @NonNull String name) { @@ -128,6 +131,7 @@ public final class UUIDArgument extends CommandArgument { } + @API(status = API.Status.STABLE) public static final class UUIDParser implements ArgumentParser { @Override @@ -160,6 +164,7 @@ public final class UUIDArgument extends CommandArgument { } + @API(status = API.Status.STABLE) public static final class UUIDParseException extends ParserException { private static final long serialVersionUID = 6399602590976540023L; diff --git a/cloud-core/src/main/java/cloud/commandframework/captions/Caption.java b/cloud-core/src/main/java/cloud/commandframework/captions/Caption.java index 6d2eaaa8..13bd7deb 100644 --- a/cloud-core/src/main/java/cloud/commandframework/captions/Caption.java +++ b/cloud-core/src/main/java/cloud/commandframework/captions/Caption.java @@ -24,11 +24,13 @@ package cloud.commandframework.captions; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * This is a reference to a caption and does not contain any message itself */ +@API(status = API.Status.STABLE) public final class Caption { private final String key; diff --git a/cloud-core/src/main/java/cloud/commandframework/captions/CaptionRegistry.java b/cloud-core/src/main/java/cloud/commandframework/captions/CaptionRegistry.java index eeb2abf7..9057804d 100644 --- a/cloud-core/src/main/java/cloud/commandframework/captions/CaptionRegistry.java +++ b/cloud-core/src/main/java/cloud/commandframework/captions/CaptionRegistry.java @@ -23,6 +23,7 @@ // package cloud.commandframework.captions; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -30,6 +31,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public interface CaptionRegistry { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/captions/CaptionVariable.java b/cloud-core/src/main/java/cloud/commandframework/captions/CaptionVariable.java index 8d40c601..d434cc76 100644 --- a/cloud-core/src/main/java/cloud/commandframework/captions/CaptionVariable.java +++ b/cloud-core/src/main/java/cloud/commandframework/captions/CaptionVariable.java @@ -23,11 +23,13 @@ // package cloud.commandframework.captions; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * Key-value pair used to replace variables in captions */ +@API(status = API.Status.STABLE) public final class CaptionVariable { private final String key; diff --git a/cloud-core/src/main/java/cloud/commandframework/captions/CaptionVariableReplacementHandler.java b/cloud-core/src/main/java/cloud/commandframework/captions/CaptionVariableReplacementHandler.java index 8b68901e..90fcf247 100644 --- a/cloud-core/src/main/java/cloud/commandframework/captions/CaptionVariableReplacementHandler.java +++ b/cloud-core/src/main/java/cloud/commandframework/captions/CaptionVariableReplacementHandler.java @@ -23,11 +23,13 @@ // package cloud.commandframework.captions; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * Utility that replaces variables in captions */ +@API(status = API.Status.STABLE) public interface CaptionVariableReplacementHandler { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/captions/FactoryDelegatingCaptionRegistry.java b/cloud-core/src/main/java/cloud/commandframework/captions/FactoryDelegatingCaptionRegistry.java index f1d9e9ea..9ce5159a 100644 --- a/cloud-core/src/main/java/cloud/commandframework/captions/FactoryDelegatingCaptionRegistry.java +++ b/cloud-core/src/main/java/cloud/commandframework/captions/FactoryDelegatingCaptionRegistry.java @@ -24,6 +24,7 @@ package cloud.commandframework.captions; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -31,6 +32,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public interface FactoryDelegatingCaptionRegistry extends CaptionRegistry { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionRegistry.java b/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionRegistry.java index 31315c4c..16603f8e 100644 --- a/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionRegistry.java +++ b/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionRegistry.java @@ -26,6 +26,7 @@ package cloud.commandframework.captions; import java.util.HashMap; import java.util.Map; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -33,6 +34,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public class SimpleCaptionRegistry implements FactoryDelegatingCaptionRegistry { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionRegistryFactory.java b/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionRegistryFactory.java index cd4855c9..1006ff20 100644 --- a/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionRegistryFactory.java +++ b/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionRegistryFactory.java @@ -23,6 +23,7 @@ // package cloud.commandframework.captions; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -30,6 +31,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public final class SimpleCaptionRegistryFactory { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionVariableReplacementHandler.java b/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionVariableReplacementHandler.java index 4b8cfe11..ea697d32 100644 --- a/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionVariableReplacementHandler.java +++ b/cloud-core/src/main/java/cloud/commandframework/captions/SimpleCaptionVariableReplacementHandler.java @@ -23,11 +23,13 @@ // package cloud.commandframework.captions; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * Simple implementation of {@link CaptionVariableReplacementHandler} */ +@API(status = API.Status.STABLE) public final class SimpleCaptionVariableReplacementHandler implements CaptionVariableReplacementHandler { @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/captions/StandardCaptionKeys.java b/cloud-core/src/main/java/cloud/commandframework/captions/StandardCaptionKeys.java index 2227c9f6..b1e35c53 100644 --- a/cloud-core/src/main/java/cloud/commandframework/captions/StandardCaptionKeys.java +++ b/cloud-core/src/main/java/cloud/commandframework/captions/StandardCaptionKeys.java @@ -26,11 +26,13 @@ package cloud.commandframework.captions; import java.util.Collection; import java.util.Collections; import java.util.LinkedList; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * {@link Caption} instances for messages in cloud-core */ +@API(status = API.Status.STABLE) public final class StandardCaptionKeys { private static final Collection RECOGNIZED_CAPTIONS = new LinkedList<>(); diff --git a/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java b/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java index e284e850..1fdbd6b2 100644 --- a/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java +++ b/cloud-core/src/main/java/cloud/commandframework/context/CommandContext.java @@ -42,6 +42,7 @@ import java.util.LinkedList; import java.util.Map; import java.util.Optional; import java.util.function.Supplier; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -50,6 +51,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * * @param Command sender type */ +@API(status = API.Status.STABLE) public class CommandContext { private final CaptionVariableReplacementHandler captionVariableReplacementHandler; @@ -71,6 +73,7 @@ public class CommandContext { * @deprecated Provide a command manager instead of a caption registry */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.3.0") public CommandContext(final @NonNull C commandSender, final @NonNull CaptionRegistry captionRegistry) { this(false, commandSender, captionRegistry); } @@ -82,6 +85,7 @@ public class CommandContext { * @param commandManager Command manager * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public CommandContext(final @NonNull C commandSender, final @NonNull CommandManager commandManager) { this(false, commandSender, commandManager); } @@ -89,12 +93,13 @@ public class CommandContext { /** * Create a new command context instance * - * @param suggestions Whether or not the context is created for command suggestions + * @param suggestions Whether the context is created for command suggestions * @param commandSender Sender of the command * @param captionRegistry Caption registry * @deprecated Provide a command manager instead of a caption registry */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.3.0") public CommandContext( final boolean suggestions, final @NonNull C commandSender, @@ -110,11 +115,12 @@ public class CommandContext { /** * Create a new command context instance * - * @param suggestions Whether or not the context is created for command suggestions + * @param suggestions Whether the context is created for command suggestions * @param commandSender Sender of the command * @param commandManager Command manager * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public CommandContext( final boolean suggestions, final @NonNull C commandSender, @@ -160,6 +166,7 @@ public class CommandContext { * @return Command sender * @since 1.6.0 */ + @API(status = API.Status.STABLE, since = "1.6.0") public boolean hasPermission(final @NonNull CommandPermission permission) { return this.commandManager.hasPermission(this.commandSender, permission); } @@ -171,6 +178,7 @@ public class CommandContext { * @return Command sender * @since 1.6.0 */ + @API(status = API.Status.STABLE, since = "1.6.0") public boolean hasPermission(final @NonNull String permission) { return this.commandManager.hasPermission(this.commandSender, permission); } @@ -229,6 +237,7 @@ public class CommandContext { * @param Value type * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public void store(final @NonNull CloudKeyHolder keyHolder, final @NonNull T value) { this.internalStorage.put(keyHolder.getKey(), value); } @@ -244,6 +253,7 @@ public class CommandContext { * @param Value type * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public void set(final @NonNull String key, final @Nullable T value) { if (value != null) { this.store(key, value); @@ -263,6 +273,7 @@ public class CommandContext { * @param Value type * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public void set(final @NonNull CloudKey key, final @Nullable T value) { if (value != null) { this.store(key, value); @@ -278,6 +289,7 @@ public class CommandContext { * @return Whether the context has a value for the provided key * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public boolean contains(final @NonNull String key) { return this.contains(SimpleCloudKey.of(key)); } @@ -289,6 +301,7 @@ public class CommandContext { * @return Whether the context has a value for the provided key * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public boolean contains(final @NonNull CloudKey key) { return this.internalStorage.containsKey(key); } @@ -299,6 +312,7 @@ public class CommandContext { * @return An immutable copy of this command context as a map * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public @NonNull Map<@NonNull String, @Nullable ?> asMap() { final Map values = new HashMap<>(); this.internalStorage.forEach((key, value) -> values.put(key.getName(), value)); @@ -332,6 +346,7 @@ public class CommandContext { * @return Value * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull Optional getOptional(final @NonNull CloudKey key) { final Object value = this.internalStorage.get(key); if (value != null) { @@ -365,6 +380,7 @@ public class CommandContext { * @since 1.4.0 */ @SuppressWarnings("unused") + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull Optional getOptional(final @NonNull CloudKeyHolder keyHolder) { final Object value = this.internalStorage.get(keyHolder.getKey()); if (value != null) { @@ -390,6 +406,7 @@ public class CommandContext { * @param key Key to remove * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public void remove(final @NonNull CloudKey key) { this.internalStorage.remove(key); } @@ -423,6 +440,7 @@ public class CommandContext { * @since 1.4.0 */ @SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"}) + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull T get(final @NonNull CloudKey key) { final Object value = this.internalStorage.get(key); if (value == null) { @@ -454,6 +472,7 @@ public class CommandContext { * @throws NullPointerException If no such value is stored * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull T get(final @NonNull CloudKeyHolder keyHolder) { return this.get(keyHolder.getKey()); } @@ -497,6 +516,7 @@ public class CommandContext { * @return Argument, or supplied default value * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @Nullable T getOrDefault( final @NonNull CloudKey key, final @Nullable T defaultValue @@ -513,6 +533,7 @@ public class CommandContext { * @return Argument, or supplied default value * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") public @Nullable T getOrSupplyDefault( final @NonNull String key, final @NonNull Supplier<@Nullable T> defaultSupplier @@ -529,6 +550,7 @@ public class CommandContext { * @return Argument, or supplied default value * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @Nullable T getOrSupplyDefault( final @NonNull CloudKey key, final @NonNull Supplier<@Nullable T> defaultSupplier @@ -551,6 +573,7 @@ public class CommandContext { * @return {@link #getRawInput()} joined with {@code " "} as the delimiter * @since 1.1.0 */ + @API(status = API.Status.STABLE, since = "1.1.0") public @NonNull String getRawInputJoined() { return String.join(" ", this.getRawInput()); } @@ -593,6 +616,7 @@ public class CommandContext { * @return Currently parsing {@link CommandArgument} or {@code null} * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") public @Nullable CommandArgument getCurrentArgument() { return this.currentArgument; } @@ -605,6 +629,7 @@ public class CommandContext { * @param argument Currently parsing {@link CommandArgument} or {@code null} * @since 1.2.0 */ + @API(status = API.Status.STABLE, since = "1.2.0") public void setCurrentArgument(final @Nullable CommandArgument argument) { this.currentArgument = argument; } @@ -618,7 +643,7 @@ public class CommandContext { * @return Optional that may contain the created value * @since 1.3.0 */ - @SuppressWarnings("unchecked") + @API(status = API.Status.STABLE, since = "1.3.0") public <@NonNull T> @NonNull Optional inject(final @NonNull Class clazz) { if (this.commandManager == null) { throw new UnsupportedOperationException( @@ -636,6 +661,7 @@ public class CommandContext { *

* The times are measured in nanoseconds. */ + @API(status = API.Status.STABLE) public static final class ArgumentTiming { private long start; @@ -647,7 +673,7 @@ public class CommandContext { * * @param start Start time (in nanoseconds) * @param end End time (in nanoseconds) - * @param success Whether or not the argument was parsed successfully + * @param success Whether the argument was parsed successfully */ public ArgumentTiming(final long start, final long end, final boolean success) { this.start = start; @@ -690,7 +716,7 @@ public class CommandContext { * Set the end time * * @param end End time (in nanoseconds) - * @param success Whether or not the argument was parsed successfully + * @param success Whether the argument was parsed successfully */ public void setEnd(final long end, final boolean success) { this.end = end; @@ -707,7 +733,7 @@ public class CommandContext { } /** - * Check whether or not the value was parsed successfully + * Check whether the value was parsed successfully * * @return {@code true} if the value was parsed successfully, {@code false} if not */ diff --git a/cloud-core/src/main/java/cloud/commandframework/context/CommandContextFactory.java b/cloud-core/src/main/java/cloud/commandframework/context/CommandContextFactory.java index 013036e1..d9fa478d 100644 --- a/cloud-core/src/main/java/cloud/commandframework/context/CommandContextFactory.java +++ b/cloud-core/src/main/java/cloud/commandframework/context/CommandContextFactory.java @@ -25,6 +25,7 @@ package cloud.commandframework.context; import cloud.commandframework.CommandManager; import cloud.commandframework.captions.CaptionRegistry; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender */ +@API(status = API.Status.STABLE) public interface CommandContextFactory { /** @@ -44,6 +46,7 @@ public interface CommandContextFactory { * @deprecated Provide a command manager instead of a caption registry */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.3.0") @NonNull CommandContext create( boolean suggestions, @NonNull C sender, @@ -59,6 +62,7 @@ public interface CommandContextFactory { * @return Command context * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") @NonNull CommandContext create( boolean suggestions, @NonNull C sender, diff --git a/cloud-core/src/main/java/cloud/commandframework/context/StandardCommandContextFactory.java b/cloud-core/src/main/java/cloud/commandframework/context/StandardCommandContextFactory.java index 3b5de20f..4718fdff 100644 --- a/cloud-core/src/main/java/cloud/commandframework/context/StandardCommandContextFactory.java +++ b/cloud-core/src/main/java/cloud/commandframework/context/StandardCommandContextFactory.java @@ -25,9 +25,11 @@ package cloud.commandframework.context; import cloud.commandframework.CommandManager; import cloud.commandframework.captions.CaptionRegistry; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; @SuppressWarnings("deprecation") +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public final class StandardCommandContextFactory implements CommandContextFactory { @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/AmbiguousNodeException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/AmbiguousNodeException.java index 880263d3..f74438ac 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/AmbiguousNodeException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/AmbiguousNodeException.java @@ -28,6 +28,7 @@ import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.context.CommandContext; import java.util.Iterator; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -37,6 +38,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * is detected. */ @SuppressWarnings({"unused", "serial"}) +@API(status = API.Status.STABLE) public final class AmbiguousNodeException extends IllegalStateException { private static final long serialVersionUID = -200207173805584709L; @@ -51,6 +53,7 @@ public final class AmbiguousNodeException extends IllegalStateException { * @param ambiguousNode Node that caused exception * @param children All children of the parent */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public AmbiguousNodeException( final @Nullable CommandArgument parentNode, final @NonNull CommandArgument ambiguousNode, diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/ArgumentParseException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/ArgumentParseException.java index 945f7081..9c89d876 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/ArgumentParseException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/ArgumentParseException.java @@ -25,8 +25,10 @@ package cloud.commandframework.exceptions; import cloud.commandframework.arguments.CommandArgument; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; +@API(status = API.Status.STABLE) public class ArgumentParseException extends CommandParseException { private static final long serialVersionUID = -4385446899439587461L; @@ -39,6 +41,7 @@ public class ArgumentParseException extends CommandParseException { * @param commandSender Command sender * @param currentChain Chain leading up to the exception */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public ArgumentParseException( final @NonNull Throwable throwable, final @NonNull Object commandSender, diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/CommandExecutionException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/CommandExecutionException.java index e99c6a5d..a37ac96f 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/CommandExecutionException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/CommandExecutionException.java @@ -24,6 +24,7 @@ package cloud.commandframework.exceptions; import cloud.commandframework.context.CommandContext; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -33,6 +34,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * @since 1.2.0 */ @SuppressWarnings("serial") +@API(status = API.Status.STABLE, since = "1.2.0") public class CommandExecutionException extends IllegalArgumentException { private static final long serialVersionUID = -4785446899438294661L; @@ -43,6 +45,7 @@ public class CommandExecutionException extends IllegalArgumentException { * * @param cause Exception thrown during the execution of a command handler */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public CommandExecutionException(final @NonNull Throwable cause) { this(cause, null); } @@ -54,6 +57,7 @@ public class CommandExecutionException extends IllegalArgumentException { * @param commandContext Command context * @since 1.4.0 */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*", since = "1.4.0") public CommandExecutionException(final @NonNull Throwable cause, final @Nullable CommandContext commandContext) { super(cause); this.commandContext = commandContext; @@ -65,6 +69,7 @@ public class CommandExecutionException extends IllegalArgumentException { * @return Command * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @Nullable CommandContext getCommandContext() { return this.commandContext; } diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/CommandParseException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/CommandParseException.java index bd09fc7b..5ae2e6cb 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/CommandParseException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/CommandParseException.java @@ -26,12 +26,14 @@ package cloud.commandframework.exceptions; import cloud.commandframework.arguments.CommandArgument; import java.util.Collections; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * Exception thrown when parsing user input into a command */ @SuppressWarnings({"unused", "serial"}) +@API(status = API.Status.STABLE) public class CommandParseException extends IllegalArgumentException { private static final long serialVersionUID = -2415981126382517435L; @@ -44,6 +46,7 @@ public class CommandParseException extends IllegalArgumentException { * @param commandSender Sender who executed the command * @param currentChain Chain leading up to the exception */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") protected CommandParseException( final @NonNull Object commandSender, final @NonNull List> currentChain diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/InvalidCommandSenderException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/InvalidCommandSenderException.java index c72b9e0c..13d178ae 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/InvalidCommandSenderException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/InvalidCommandSenderException.java @@ -26,6 +26,7 @@ package cloud.commandframework.exceptions; import cloud.commandframework.Command; import cloud.commandframework.arguments.CommandArgument; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -33,6 +34,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * Exception thrown when an invalid command sender tries to execute a command */ @SuppressWarnings("serial") +@API(status = API.Status.STABLE) public final class InvalidCommandSenderException extends CommandParseException { private static final long serialVersionUID = 7372142477529875598L; @@ -46,6 +48,7 @@ public final class InvalidCommandSenderException extends CommandParseException { * @param requiredSender The sender type that is required * @param currentChain Chain leading up to the exception */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public InvalidCommandSenderException( final @NonNull Object commandSender, final @NonNull Class requiredSender, @@ -63,6 +66,7 @@ public final class InvalidCommandSenderException extends CommandParseException { * @param command Command * @since 1.4.0 */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*", since = "1.4.0") public InvalidCommandSenderException( final @NonNull Object commandSender, final @NonNull Class requiredSender, @@ -98,6 +102,7 @@ public final class InvalidCommandSenderException extends CommandParseException { * @return Command * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @Nullable Command getCommand() { return this.command; } diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/InvalidSyntaxException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/InvalidSyntaxException.java index 84b6b1be..2863137b 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/InvalidSyntaxException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/InvalidSyntaxException.java @@ -25,12 +25,14 @@ package cloud.commandframework.exceptions; import cloud.commandframework.arguments.CommandArgument; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * Exception sent when a command sender inputs invalid command syntax */ @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public class InvalidSyntaxException extends CommandParseException { private static final long serialVersionUID = -4183356059293785202L; @@ -43,6 +45,7 @@ public class InvalidSyntaxException extends CommandParseException { * @param commandSender Sender that sent the command * @param currentChain Chain leading up to issue */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public InvalidSyntaxException( final @NonNull String correctSyntax, final @NonNull Object commandSender, diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/NoCommandInLeafException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/NoCommandInLeafException.java index 644c4875..56124271 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/NoCommandInLeafException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/NoCommandInLeafException.java @@ -25,6 +25,7 @@ package cloud.commandframework.exceptions; import cloud.commandframework.Command; import cloud.commandframework.arguments.CommandArgument; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * that is registered as a leaf node, does not contain an owning {@link Command} */ @SuppressWarnings({"unused", "serial"}) +@API(status = API.Status.STABLE) public final class NoCommandInLeafException extends IllegalStateException { private static final long serialVersionUID = 3373529875213310821L; @@ -42,6 +44,7 @@ public final class NoCommandInLeafException extends IllegalStateException { * * @param commandArgument Command argument that caused the exception */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public NoCommandInLeafException(final @NonNull CommandArgument commandArgument) { super(String.format("Leaf node '%s' does not have associated owning command", commandArgument.getName())); this.commandArgument = commandArgument; diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/NoPermissionException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/NoPermissionException.java index 0b502919..44d45984 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/NoPermissionException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/NoPermissionException.java @@ -27,6 +27,7 @@ import cloud.commandframework.Command; import cloud.commandframework.arguments.CommandArgument; import cloud.commandframework.permission.CommandPermission; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -34,6 +35,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * to execute a {@link Command} */ @SuppressWarnings({"unused", "serial"}) +@API(status = API.Status.STABLE) public class NoPermissionException extends CommandParseException { private static final long serialVersionUID = 7103413337750692843L; @@ -46,6 +48,7 @@ public class NoPermissionException extends CommandParseException { * @param commandSender Command sender * @param currentChain Chain leading up to the exception */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public NoPermissionException( final @NonNull CommandPermission missingPermission, final @NonNull Object commandSender, diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/NoSuchCommandException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/NoSuchCommandException.java index f6bf074b..ceb32d99 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/NoSuchCommandException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/NoSuchCommandException.java @@ -25,6 +25,7 @@ package cloud.commandframework.exceptions; import cloud.commandframework.arguments.CommandArgument; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * a command that doesn't exist */ @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public final class NoSuchCommandException extends CommandParseException { private static final long serialVersionUID = -7775865652882764771L; @@ -44,6 +46,7 @@ public final class NoSuchCommandException extends CommandParseException { * @param currentChain Chain leading up to the exception * @param command Entered command (following the command chain) */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public NoSuchCommandException( final @NonNull Object commandSender, final @NonNull List> currentChain, diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/NoInputProvidedException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/NoInputProvidedException.java index 70469744..7c046072 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/NoInputProvidedException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/NoInputProvidedException.java @@ -25,6 +25,7 @@ package cloud.commandframework.exceptions.parsing; import cloud.commandframework.captions.StandardCaptionKeys; import cloud.commandframework.context.CommandContext; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @since 1.1.0 */ +@API(status = API.Status.STABLE, since = "1.1.0") public class NoInputProvidedException extends ParserException { private static final long serialVersionUID = 3485754951593709559L; diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/NumberParseException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/NumberParseException.java index 329d18f3..6062198f 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/NumberParseException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/NumberParseException.java @@ -26,8 +26,10 @@ package cloud.commandframework.exceptions.parsing; import cloud.commandframework.captions.CaptionVariable; import cloud.commandframework.captions.StandardCaptionKeys; import cloud.commandframework.context.CommandContext; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; +@API(status = API.Status.STABLE) public abstract class NumberParseException extends ParserException { private static final long serialVersionUID = 3018775374056029797L; diff --git a/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/ParserException.java b/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/ParserException.java index 9b684b3e..673dacf4 100644 --- a/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/ParserException.java +++ b/cloud-core/src/main/java/cloud/commandframework/exceptions/parsing/ParserException.java @@ -27,9 +27,11 @@ import cloud.commandframework.captions.Caption; import cloud.commandframework.captions.CaptionVariable; import cloud.commandframework.context.CommandContext; import java.util.Arrays; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; @SuppressWarnings("serial") +@API(status = API.Status.STABLE) public class ParserException extends IllegalArgumentException { private static final long serialVersionUID = -4409795575435072170L; @@ -64,6 +66,7 @@ public class ParserException extends IllegalArgumentException { * @return The caption * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull Caption errorCaption() { return this.errorCaption; } @@ -75,6 +78,7 @@ public class ParserException extends IllegalArgumentException { * @return The caption variables * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") public @NonNull CaptionVariable @NonNull [] captionVariables() { return Arrays.copyOf(this.captionVariables, this.captionVariables.length); } diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/AsynchronousCommandExecutionCoordinator.java b/cloud-core/src/main/java/cloud/commandframework/execution/AsynchronousCommandExecutionCoordinator.java index 203f41b5..b108ab5d 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/AsynchronousCommandExecutionCoordinator.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/AsynchronousCommandExecutionCoordinator.java @@ -36,6 +36,7 @@ import java.util.concurrent.Executor; import java.util.concurrent.ForkJoinPool; import java.util.function.Consumer; import java.util.function.Function; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.common.returnsreceiver.qual.This; @@ -45,6 +46,7 @@ import org.checkerframework.common.returnsreceiver.qual.This; * * @param Command sender type */ +@API(status = API.Status.STABLE) public final class AsynchronousCommandExecutionCoordinator extends CommandExecutionCoordinator { private final CommandManager commandManager; @@ -128,6 +130,7 @@ public final class AsynchronousCommandExecutionCoordinator extends CommandExe * * @param Command sender type */ + @API(status = API.Status.STABLE) public static final class Builder { private Executor executor = null; diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/CommandExecutionCoordinator.java b/cloud-core/src/main/java/cloud/commandframework/execution/CommandExecutionCoordinator.java index aa613e20..0b1fdc9d 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/CommandExecutionCoordinator.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/CommandExecutionCoordinator.java @@ -33,6 +33,7 @@ import java.util.Objects; import java.util.Queue; import java.util.concurrent.CompletableFuture; import java.util.function.Function; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -44,6 +45,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * * @param Command sender type */ +@API(status = API.Status.STABLE) public abstract class CommandExecutionCoordinator { private final CommandTree commandTree; @@ -95,6 +97,7 @@ public abstract class CommandExecutionCoordinator { * * @param Command sender type */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public static final class SimpleCoordinator extends CommandExecutionCoordinator { diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/CommandExecutionHandler.java b/cloud-core/src/main/java/cloud/commandframework/execution/CommandExecutionHandler.java index 5d3c567f..74e4297a 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/CommandExecutionHandler.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/CommandExecutionHandler.java @@ -28,6 +28,7 @@ import cloud.commandframework.context.CommandContext; import java.util.Collections; import java.util.List; import java.util.concurrent.CompletableFuture; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.MonotonicNonNull; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -39,6 +40,7 @@ import org.checkerframework.checker.nullness.qual.Nullable; * @param Command sender type */ @FunctionalInterface +@API(status = API.Status.STABLE) public interface CommandExecutionHandler { /** @@ -48,6 +50,7 @@ public interface CommandExecutionHandler { * @return command execution handler that does nothing * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") static @NonNull CommandExecutionHandler noOpCommandExecutionHandler() { return new NullCommandExecutionHandler<>(); } @@ -64,6 +67,7 @@ public interface CommandExecutionHandler { * @return multicast-delegate command execution handler * @since 1.7.0 */ + @API(status = API.Status.STABLE, since = "1.7.0") static @NonNull CommandExecutionHandler delegatingExecutionHandler( final List> handlers ) { @@ -84,6 +88,7 @@ public interface CommandExecutionHandler { * @return future that completes when the command has finished execution * @since 1.6.0 */ + @API(status = API.Status.STABLE, since = "1.6.0") default CompletableFuture<@Nullable Void> executeFuture(@NonNull CommandContext commandContext) { final CompletableFuture future = new CompletableFuture<>(); try { @@ -101,6 +106,7 @@ public interface CommandExecutionHandler { * * @param Command sender type */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") class NullCommandExecutionHandler implements CommandExecutionHandler { @Override @@ -117,6 +123,7 @@ public interface CommandExecutionHandler { * @since 1.6.0 */ @FunctionalInterface + @API(status = API.Status.STABLE, since = "1.6.0") interface FutureCommandExecutionHandler extends CommandExecutionHandler { @Override @@ -140,6 +147,7 @@ public interface CommandExecutionHandler { * @see #delegatingExecutionHandler(List) * @since 1.7.0 */ + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*", since = "1.7.0") final class MulticastDelegateFutureCommandExecutionHandler implements FutureCommandExecutionHandler { private final List> handlers; diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/CommandResult.java b/cloud-core/src/main/java/cloud/commandframework/execution/CommandResult.java index 99f90796..d7312e16 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/CommandResult.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/CommandResult.java @@ -24,6 +24,7 @@ package cloud.commandframework.execution; import cloud.commandframework.context.CommandContext; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -31,6 +32,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public class CommandResult { private final CommandContext commandContext; diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/CommandSuggestionProcessor.java b/cloud-core/src/main/java/cloud/commandframework/execution/CommandSuggestionProcessor.java index c37fb5d3..9a6a16ef 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/CommandSuggestionProcessor.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/CommandSuggestionProcessor.java @@ -26,6 +26,7 @@ package cloud.commandframework.execution; import cloud.commandframework.execution.preprocessor.CommandPreprocessingContext; import java.util.List; import java.util.function.BiFunction; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -33,6 +34,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public interface CommandSuggestionProcessor extends BiFunction<@NonNull CommandPreprocessingContext, @NonNull List, @NonNull List> { diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/FilteringCommandSuggestionProcessor.java b/cloud-core/src/main/java/cloud/commandframework/execution/FilteringCommandSuggestionProcessor.java index da018415..ebe228d1 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/FilteringCommandSuggestionProcessor.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/FilteringCommandSuggestionProcessor.java @@ -26,13 +26,15 @@ package cloud.commandframework.execution; import cloud.commandframework.execution.preprocessor.CommandPreprocessingContext; import java.util.LinkedList; import java.util.List; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** - * Command suggestions processor that checks the input queue head and filters based on that + * Command suggestion processor that checks the input queue head and filters based on that * * @param Command sender type */ +@API(status = API.Status.STABLE) public final class FilteringCommandSuggestionProcessor implements CommandSuggestionProcessor { @Override diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/AcceptingCommandPostprocessor.java b/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/AcceptingCommandPostprocessor.java index ab9b30a9..9058a19d 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/AcceptingCommandPostprocessor.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/AcceptingCommandPostprocessor.java @@ -23,6 +23,7 @@ // package cloud.commandframework.execution.postprocessor; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -31,6 +32,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public final class AcceptingCommandPostprocessor implements CommandPostprocessor { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/CommandPostprocessingContext.java b/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/CommandPostprocessingContext.java index f38ba058..e7f3a10c 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/CommandPostprocessingContext.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/CommandPostprocessingContext.java @@ -26,6 +26,7 @@ package cloud.commandframework.execution.postprocessor; import cloud.commandframework.Command; import cloud.commandframework.context.CommandContext; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -33,6 +34,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public final class CommandPostprocessingContext { private final CommandContext<@NonNull C> commandContext; diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/CommandPostprocessor.java b/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/CommandPostprocessor.java index 3d8ac72e..1da76a33 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/CommandPostprocessor.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/postprocessor/CommandPostprocessor.java @@ -24,12 +24,14 @@ package cloud.commandframework.execution.postprocessor; import cloud.commandframework.services.types.ConsumerService; +import org.apiguardian.api.API; /** * Command postprocessor that acts on commands before execution * * @param Command sender type */ +@API(status = API.Status.STABLE) public interface CommandPostprocessor extends ConsumerService> { } diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/AcceptingCommandPreprocessor.java b/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/AcceptingCommandPreprocessor.java index b3f7e834..78db155c 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/AcceptingCommandPreprocessor.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/AcceptingCommandPreprocessor.java @@ -23,6 +23,7 @@ // package cloud.commandframework.execution.preprocessor; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -31,6 +32,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public final class AcceptingCommandPreprocessor implements CommandPreprocessor { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/CommandPreprocessingContext.java b/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/CommandPreprocessingContext.java index b575c80e..f866c640 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/CommandPreprocessingContext.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/CommandPreprocessingContext.java @@ -26,6 +26,7 @@ package cloud.commandframework.execution.preprocessor; import cloud.commandframework.context.CommandContext; import java.util.LinkedList; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -33,6 +34,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public final class CommandPreprocessingContext { private final CommandContext commandContext; diff --git a/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/CommandPreprocessor.java b/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/CommandPreprocessor.java index 008feee7..7b221e91 100644 --- a/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/CommandPreprocessor.java +++ b/cloud-core/src/main/java/cloud/commandframework/execution/preprocessor/CommandPreprocessor.java @@ -24,6 +24,7 @@ package cloud.commandframework.execution.preprocessor; import cloud.commandframework.services.types.ConsumerService; +import org.apiguardian.api.API; /** * Command preprocessor that gets to act on command input @@ -34,6 +35,7 @@ import cloud.commandframework.services.types.ConsumerService; * * @param Command sender type */ +@API(status = API.Status.STABLE) public interface CommandPreprocessor extends ConsumerService> { } diff --git a/cloud-core/src/main/java/cloud/commandframework/extra/confirmation/CommandConfirmationManager.java b/cloud-core/src/main/java/cloud/commandframework/extra/confirmation/CommandConfirmationManager.java index e22d12aa..8aa67119 100644 --- a/cloud-core/src/main/java/cloud/commandframework/extra/confirmation/CommandConfirmationManager.java +++ b/cloud-core/src/main/java/cloud/commandframework/extra/confirmation/CommandConfirmationManager.java @@ -37,6 +37,7 @@ import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.function.Consumer; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -51,6 +52,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * * @param Command sender type */ +@API(status = API.Status.STABLE) public class CommandConfirmationManager { /** @@ -67,10 +69,11 @@ public class CommandConfirmationManager { ); /** - * Meta data stored for commands that require confirmation + * Metadata stored for commands that require confirmation * * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public static final CommandMeta.Key META_CONFIRMATION_REQUIRED = CommandMeta.Key.of( Boolean.class, "cloud:require_confirmation", diff --git a/cloud-core/src/main/java/cloud/commandframework/internal/CommandInputTokenizer.java b/cloud-core/src/main/java/cloud/commandframework/internal/CommandInputTokenizer.java index 79e57dc8..469a46f6 100644 --- a/cloud-core/src/main/java/cloud/commandframework/internal/CommandInputTokenizer.java +++ b/cloud-core/src/main/java/cloud/commandframework/internal/CommandInputTokenizer.java @@ -25,6 +25,7 @@ package cloud.commandframework.internal; import java.util.LinkedList; import java.util.StringTokenizer; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * at every blank space. If the input string ends with a blank space, a trailing * empty string will be added to the token list */ +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public final class CommandInputTokenizer { private static final String DELIMITER = " "; diff --git a/cloud-core/src/main/java/cloud/commandframework/internal/CommandRegistrationHandler.java b/cloud-core/src/main/java/cloud/commandframework/internal/CommandRegistrationHandler.java index e15ae0f1..0f46e19a 100644 --- a/cloud-core/src/main/java/cloud/commandframework/internal/CommandRegistrationHandler.java +++ b/cloud-core/src/main/java/cloud/commandframework/internal/CommandRegistrationHandler.java @@ -24,6 +24,7 @@ package cloud.commandframework.internal; import cloud.commandframework.Command; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * the target platform does not have its own concept of commands */ @FunctionalInterface +@API(status = API.Status.STABLE) public interface CommandRegistrationHandler { /** @@ -52,6 +54,8 @@ public interface CommandRegistrationHandler { */ boolean registerCommand(@NonNull Command command); + + @API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") final class NullCommandRegistrationHandler implements CommandRegistrationHandler { private NullCommandRegistrationHandler() { diff --git a/cloud-core/src/main/java/cloud/commandframework/keys/CloudKey.java b/cloud-core/src/main/java/cloud/commandframework/keys/CloudKey.java index 7cbcfb27..2538b7df 100644 --- a/cloud-core/src/main/java/cloud/commandframework/keys/CloudKey.java +++ b/cloud-core/src/main/java/cloud/commandframework/keys/CloudKey.java @@ -24,6 +24,7 @@ package cloud.commandframework.keys; import io.leangen.geantyref.TypeToken; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param The type of the key * @since 1.4.0 */ +@API(status = API.Status.STABLE, since = "1.4.0") public interface CloudKey { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/keys/CloudKeyHolder.java b/cloud-core/src/main/java/cloud/commandframework/keys/CloudKeyHolder.java index fc01c501..dcb7426b 100644 --- a/cloud-core/src/main/java/cloud/commandframework/keys/CloudKeyHolder.java +++ b/cloud-core/src/main/java/cloud/commandframework/keys/CloudKeyHolder.java @@ -23,6 +23,7 @@ // package cloud.commandframework.keys; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @since 1.4.0 */ @FunctionalInterface +@API(status = API.Status.STABLE, since = "1.4.0") public interface CloudKeyHolder { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/keys/SimpleCloudKey.java b/cloud-core/src/main/java/cloud/commandframework/keys/SimpleCloudKey.java index 3e8b2a83..8c1b48e2 100644 --- a/cloud-core/src/main/java/cloud/commandframework/keys/SimpleCloudKey.java +++ b/cloud-core/src/main/java/cloud/commandframework/keys/SimpleCloudKey.java @@ -25,6 +25,7 @@ package cloud.commandframework.keys; import io.leangen.geantyref.TypeToken; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -35,6 +36,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param Key type * @since 1.4.0 */ +@API(status = API.Status.STABLE, since = "1.4.0") public final class SimpleCloudKey<@NonNull T> implements CloudKey { private final String name; diff --git a/cloud-core/src/main/java/cloud/commandframework/meta/CommandMeta.java b/cloud-core/src/main/java/cloud/commandframework/meta/CommandMeta.java index 9d11fe04..1d6f154b 100644 --- a/cloud-core/src/main/java/cloud/commandframework/meta/CommandMeta.java +++ b/cloud-core/src/main/java/cloud/commandframework/meta/CommandMeta.java @@ -30,6 +30,7 @@ import io.leangen.geantyref.TypeToken; import java.util.Map; import java.util.Optional; import java.util.function.Function; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; @@ -41,6 +42,7 @@ import static java.util.Objects.requireNonNull; *

* Appropriate use for command meta would be fixed state, such as command descriptions. */ +@API(status = API.Status.STABLE) public abstract class CommandMeta { private static final Key LEGACY_HIDDEN = Key.of(String.class, "hidden"); @@ -74,6 +76,7 @@ public abstract class CommandMeta { * @deprecated for removal since 1.3.0, see typesafe variant at {@link #get(Key)} instead */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.3.0") public abstract @NonNull Optional getValue(@NonNull String key); /** @@ -85,6 +88,7 @@ public abstract class CommandMeta { * @deprecated for removal since 1.3.0, see typesafe variant at {@link #getOrDefault(Key, Object)} instead */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.3.0") public abstract @NonNull String getOrDefault(@NonNull String key, @NonNull String defaultValue); /** @@ -95,6 +99,7 @@ public abstract class CommandMeta { * @return Optional that may contain the associated value * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public abstract @NonNull Optional get(@NonNull Key key); /** @@ -106,6 +111,7 @@ public abstract class CommandMeta { * @return Value, or default value * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public abstract @NonNull V getOrDefault(@NonNull Key key, @NonNull V defaultValue); /** @@ -115,6 +121,7 @@ public abstract class CommandMeta { * @deprecated for removal since 1.3.0, use {@link #getAllValues()} instead. */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.3.0") public abstract @NonNull Map<@NonNull String, @NonNull String> getAll(); /** @@ -123,14 +130,17 @@ public abstract class CommandMeta { * @return Copy of meta map * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public abstract @NonNull Map<@NonNull String, @NonNull ?> getAllValues(); + /** * A key into the metadata map. * * @param value type * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public interface Key extends CloudKey { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/meta/SimpleCommandMeta.java b/cloud-core/src/main/java/cloud/commandframework/meta/SimpleCommandMeta.java index c7456803..8bb60fc6 100644 --- a/cloud-core/src/main/java/cloud/commandframework/meta/SimpleCommandMeta.java +++ b/cloud-core/src/main/java/cloud/commandframework/meta/SimpleCommandMeta.java @@ -30,6 +30,7 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.common.returnsreceiver.qual.This; @@ -37,6 +38,7 @@ import org.checkerframework.common.returnsreceiver.qual.This; * A simple immutable string-string map containing command meta */ @SuppressWarnings("unused") +@API(status = API.Status.STABLE) public class SimpleCommandMeta extends CommandMeta { private final Map metaMap; @@ -148,9 +150,11 @@ public class SimpleCommandMeta extends CommandMeta { return Objects.hashCode(this.metaMap); } + /** * Builder for {@link SimpleCommandMeta} */ + @API(status = API.Status.STABLE) public static final class Builder { private final Map map = new HashMap<>(); @@ -182,6 +186,7 @@ public class SimpleCommandMeta extends CommandMeta { * @deprecated For removal since 1.3.0, use {@link #with(Key, Object) the typesafe alternative} instead */ @Deprecated + @API(status = API.Status.DEPRECATED, since = "1.3.0") public @NonNull @This Builder with( final @NonNull String key, final @NonNull String value @@ -199,6 +204,7 @@ public class SimpleCommandMeta extends CommandMeta { * @return Builder instance * @since 1.3.0 */ + @API(status = API.Status.STABLE, since = "1.3.0") public @NonNull @This Builder with( final @NonNull Key key, final @NonNull V value diff --git a/cloud-core/src/main/java/cloud/commandframework/meta/SimpleKey.java b/cloud-core/src/main/java/cloud/commandframework/meta/SimpleKey.java index bbf13c4a..112894a4 100644 --- a/cloud-core/src/main/java/cloud/commandframework/meta/SimpleKey.java +++ b/cloud-core/src/main/java/cloud/commandframework/meta/SimpleKey.java @@ -26,9 +26,11 @@ package cloud.commandframework.meta; import io.leangen.geantyref.GenericTypeReflector; import io.leangen.geantyref.TypeToken; import java.util.function.Function; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") final class SimpleKey implements CommandMeta.Key { private final @NonNull TypeToken valueType; diff --git a/cloud-core/src/main/java/cloud/commandframework/permission/AndPermission.java b/cloud-core/src/main/java/cloud/commandframework/permission/AndPermission.java index 986cd243..d4dac859 100644 --- a/cloud-core/src/main/java/cloud/commandframework/permission/AndPermission.java +++ b/cloud-core/src/main/java/cloud/commandframework/permission/AndPermission.java @@ -29,11 +29,13 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Objects; import java.util.Set; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * Accepts if every single permission is accepted. */ +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public final class AndPermission implements CommandPermission { private final Set permissions; diff --git a/cloud-core/src/main/java/cloud/commandframework/permission/CommandPermission.java b/cloud-core/src/main/java/cloud/commandframework/permission/CommandPermission.java index d156e7ea..239c583d 100644 --- a/cloud-core/src/main/java/cloud/commandframework/permission/CommandPermission.java +++ b/cloud-core/src/main/java/cloud/commandframework/permission/CommandPermission.java @@ -27,6 +27,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Set; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; import static java.util.Objects.requireNonNull; @@ -34,6 +35,7 @@ import static java.util.Objects.requireNonNull; /** * A command permission representation. */ +@API(status = API.Status.STABLE) public interface CommandPermission { /** @@ -58,6 +60,7 @@ public interface CommandPermission { * @return a new {@code or} permission * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") default @NonNull CommandPermission or(final @NonNull CommandPermission other) { requireNonNull(other, "other"); final Set permission = new HashSet<>(2); @@ -73,6 +76,7 @@ public interface CommandPermission { * @return a new {@code or} permission * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") default @NonNull CommandPermission or(final @NonNull CommandPermission @NonNull... other) { requireNonNull(other, "other"); final Set permission = new HashSet<>(other.length + 1); @@ -88,6 +92,7 @@ public interface CommandPermission { * @return a new {@code and} permission * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") default @NonNull CommandPermission and(final @NonNull CommandPermission other) { requireNonNull(other, "other"); final Set permission = new HashSet<>(2); @@ -103,6 +108,7 @@ public interface CommandPermission { * @return a new {@code and} permission * @since 1.4.0 */ + @API(status = API.Status.STABLE, since = "1.4.0") default @NonNull CommandPermission and(final @NonNull CommandPermission @NonNull... other) { requireNonNull(other, "other"); final Set permission = new HashSet<>(other.length + 1); diff --git a/cloud-core/src/main/java/cloud/commandframework/permission/OrPermission.java b/cloud-core/src/main/java/cloud/commandframework/permission/OrPermission.java index 47ec80fe..5a074ccb 100644 --- a/cloud-core/src/main/java/cloud/commandframework/permission/OrPermission.java +++ b/cloud-core/src/main/java/cloud/commandframework/permission/OrPermission.java @@ -29,11 +29,13 @@ import java.util.HashSet; import java.util.Iterator; import java.util.Objects; import java.util.Set; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * Accepts as long as at least one of the permissions is accepted */ +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public final class OrPermission implements CommandPermission { private final Set permissions; diff --git a/cloud-core/src/main/java/cloud/commandframework/permission/Permission.java b/cloud-core/src/main/java/cloud/commandframework/permission/Permission.java index f327fc9c..e07832f5 100644 --- a/cloud-core/src/main/java/cloud/commandframework/permission/Permission.java +++ b/cloud-core/src/main/java/cloud/commandframework/permission/Permission.java @@ -26,11 +26,13 @@ package cloud.commandframework.permission; import java.util.Collection; import java.util.Collections; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * {@link cloud.commandframework.arguments.CommandArgument} permission */ +@API(status = API.Status.STABLE) public final class Permission implements CommandPermission { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/permission/PredicatePermission.java b/cloud-core/src/main/java/cloud/commandframework/permission/PredicatePermission.java index 3e3cf1cd..57e9bea5 100644 --- a/cloud-core/src/main/java/cloud/commandframework/permission/PredicatePermission.java +++ b/cloud-core/src/main/java/cloud/commandframework/permission/PredicatePermission.java @@ -29,6 +29,7 @@ import cloud.commandframework.keys.SimpleCloudKey; import java.util.Collection; import java.util.Collections; import java.util.function.Predicate; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -38,6 +39,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @since 1.4.0 */ @FunctionalInterface +@API(status = API.Status.STABLE, since = "1.4.0") public interface PredicatePermission extends CommandPermission, CloudKeyHolder { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/permission/WrappingPredicatePermission.java b/cloud-core/src/main/java/cloud/commandframework/permission/WrappingPredicatePermission.java index be3c372a..26edc60d 100644 --- a/cloud-core/src/main/java/cloud/commandframework/permission/WrappingPredicatePermission.java +++ b/cloud-core/src/main/java/cloud/commandframework/permission/WrappingPredicatePermission.java @@ -25,8 +25,10 @@ package cloud.commandframework.permission; import cloud.commandframework.keys.CloudKey; import java.util.function.Predicate; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") final class WrappingPredicatePermission implements PredicatePermission { private final CloudKey key; diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/DynamicTuple.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/DynamicTuple.java index fac05af1..4a9205fa 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/DynamicTuple.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/DynamicTuple.java @@ -23,11 +23,13 @@ // package cloud.commandframework.types.tuples; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * Dynamic sized tuple backed by a {@code Object[]} */ +@API(status = API.Status.STABLE) public final class DynamicTuple implements Tuple { private final Object[] internalArray; diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Pair.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Pair.java index ca57a2a6..ac02e9f9 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Pair.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Pair.java @@ -24,6 +24,7 @@ package cloud.commandframework.types.tuples; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -32,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param First type * @param Second type */ +@API(status = API.Status.STABLE) public class Pair implements Tuple { private final U first; diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quartet.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quartet.java index f2215665..8f14ea78 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quartet.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quartet.java @@ -24,6 +24,7 @@ package cloud.commandframework.types.tuples; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -34,6 +35,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param Third type * @param Fourth type */ +@API(status = API.Status.STABLE) public class Quartet implements Tuple { private final U first; diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quintet.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quintet.java index e000b4f4..55057c4f 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quintet.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Quintet.java @@ -24,6 +24,7 @@ package cloud.commandframework.types.tuples; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -35,6 +36,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param Fourth type * @param Fifth type */ +@API(status = API.Status.STABLE) public class Quintet implements Tuple { private final U first; diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Sextet.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Sextet.java index b0b11dc6..a98dbe18 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Sextet.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Sextet.java @@ -24,6 +24,7 @@ package cloud.commandframework.types.tuples; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -36,6 +37,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param Fifth type * @param Sixth type */ +@API(status = API.Status.STABLE) public class Sextet implements Tuple { private final U first; diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Triplet.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Triplet.java index 8397c515..cc5071e3 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Triplet.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Triplet.java @@ -24,6 +24,7 @@ package cloud.commandframework.types.tuples; import java.util.Objects; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** @@ -33,6 +34,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; * @param Second type * @param Third type */ +@API(status = API.Status.STABLE) public class Triplet implements Tuple { private final U first; diff --git a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Tuple.java b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Tuple.java index 5f381f60..9c560823 100644 --- a/cloud-core/src/main/java/cloud/commandframework/types/tuples/Tuple.java +++ b/cloud-core/src/main/java/cloud/commandframework/types/tuples/Tuple.java @@ -23,11 +23,13 @@ // package cloud.commandframework.types.tuples; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * Tuple type */ +@API(status = API.Status.STABLE) public interface Tuple { /** diff --git a/cloud-core/src/main/java/cloud/commandframework/util/StringUtils.java b/cloud-core/src/main/java/cloud/commandframework/util/StringUtils.java index 072a73d0..2a53b74a 100644 --- a/cloud-core/src/main/java/cloud/commandframework/util/StringUtils.java +++ b/cloud-core/src/main/java/cloud/commandframework/util/StringUtils.java @@ -23,11 +23,13 @@ // package cloud.commandframework.util; +import org.apiguardian.api.API; import org.checkerframework.checker.nullness.qual.NonNull; /** * String utilities */ +@API(status = API.Status.INTERNAL, consumers = "cloud.commandframework.*") public final class StringUtils { private StringUtils() { diff --git a/gradle/libs.versions.yml b/gradle/libs.versions.yml index 94f63918..3d14d44c 100644 --- a/gradle/libs.versions.yml +++ b/gradle/libs.versions.yml @@ -14,6 +14,7 @@ versions: errorprone: 2.9.0 geantyref: 1.3.13 jmh: 1.27 + apiguardian: 1.1.2 # integration guice: 4.2.3 @@ -88,6 +89,10 @@ dependencies: group: org.openjdk.jmh name: jmh-generator-annprocess version: { ref: jmh } + apiguardian: + group: org.apiguardian + name: apiguardian-api + version: { ref: apiguardian } # integration guice: