Skip to content

Commit

Permalink
GH-400 Add UUID argument resolver (#400)
Browse files Browse the repository at this point in the history
  • Loading branch information
BlackBaroness authored May 27, 2024
1 parent 32b6591 commit 4fbdd29
Show file tree
Hide file tree
Showing 4 changed files with 129 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package dev.rollczi.litecommands.annotations.argument.resolver.standard;

import dev.rollczi.litecommands.annotations.LiteTestSpec;
import dev.rollczi.litecommands.annotations.argument.Arg;
import dev.rollczi.litecommands.annotations.command.Command;
import dev.rollczi.litecommands.annotations.execute.Execute;
import org.junit.jupiter.api.Test;

import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.UUID;

class UUIDArgumentTest extends LiteTestSpec {

@Command(name = "test")
static class TestCommand {

@Execute
UUID test(@Arg UUID uuid) {
return uuid;
}
}

@Test
void test() {
UUID uuid = UUID.fromString("e44d9727-9da7-4f68-b608-7018a085fc6b");

// with dashes
platform.execute("test " + uuid)
.assertSuccess(uuid);

// without dashes
platform.execute("test " + uuid.toString().replace("-", ""))
.assertSuccess(uuid);
}

@Test
void testInvalid() {
platform.execute("test invalid")
.assertFailure();
}

@Test
void testSuggestions() {
platform.suggest("test ")
.assertNotEmpty()
.assertCorrect(suggestion -> platform.execute("test " + suggestion.multilevel()).assertSuccess());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package dev.rollczi.litecommands.argument.resolver.standard;

import dev.rollczi.litecommands.argument.Argument;
import dev.rollczi.litecommands.argument.parser.ParseResult;
import dev.rollczi.litecommands.argument.resolver.ArgumentResolver;
import dev.rollczi.litecommands.invalidusage.InvalidUsage;
import dev.rollczi.litecommands.invocation.Invocation;
import dev.rollczi.litecommands.message.LiteMessages;
import dev.rollczi.litecommands.message.MessageRegistry;
import dev.rollczi.litecommands.suggestion.SuggestionContext;
import dev.rollczi.litecommands.suggestion.SuggestionResult;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class UUIDArgumentResolver<SENDER> extends ArgumentResolver<SENDER, UUID> {

private final MessageRegistry<SENDER> messageRegistry;
private final SuggestionResult suggestions;

public UUIDArgumentResolver(MessageRegistry<SENDER> messageRegistry) {
this.messageRegistry = messageRegistry;

// We want to show 10 random UUIDs in both with-dashes and without-dashes formats
suggestions = Stream
.generate(() -> UUID.randomUUID().toString())
.limit(10)
.map(str -> ThreadLocalRandom.current().nextBoolean() ? str.replace("-", "") : str)
.collect(SuggestionResult.collector());
}

@Override
protected ParseResult<UUID> parse(Invocation<SENDER> invocation, Argument<UUID> context, String argument) {
try {
// Format with dashes
if (argument.length() == 36) {
return ParseResult.success(UUID.fromString(argument));
}

// Format without dashes
if (argument.length() == 32) {
return ParseResult.success(UUID.fromString(
new StringBuilder(argument)
.insert(8, '-')
.insert(13, '-')
.insert(18, '-')
.insert(23, '-')
.toString()
));
}
} catch (IllegalArgumentException ignored) {
}

return ParseResult.failure(messageRegistry.getInvoked(LiteMessages.UUID_INVALID_FORMAT, invocation, argument));
}

@Override
public SuggestionResult suggest(Invocation<SENDER> invocation, Argument<UUID> argument, SuggestionContext context) {
return suggestions;
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package dev.rollczi.litecommands.message;

import dev.rollczi.litecommands.argument.resolver.standard.InstantArgumentResolver;
import dev.rollczi.litecommands.argument.resolver.standard.UUIDArgumentResolver;
import dev.rollczi.litecommands.cooldown.CooldownState;
import dev.rollczi.litecommands.invalidusage.InvalidUsage;
import dev.rollczi.litecommands.permission.MissingPermissions;
Expand Down Expand Up @@ -56,6 +57,15 @@ public class LiteMessages {
state -> "You are on cooldown! Remaining time: " + DurationParser.DATE_TIME_UNITS.format(state.getRemainingDuration()) + " (COMMAND_COOLDOWN)"
);

/**
* Invalid UUID format.
* @see UUIDArgumentResolver
*/
public static final MessageKey<String> UUID_INVALID_FORMAT = MessageKey.of(
"uuid-invalid-format",
input -> "Invalid UUID format '" + input + "'! Use: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx (dashes are optional) (UUID_INVALID_FORMAT)"
);

protected LiteMessages() {
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import dev.rollczi.litecommands.argument.resolver.standard.NumberArgumentResolver;
import dev.rollczi.litecommands.argument.resolver.standard.PeriodArgumentResolver;
import dev.rollczi.litecommands.argument.resolver.standard.StringArgumentResolver;
import dev.rollczi.litecommands.argument.resolver.standard.UUIDArgumentResolver;
import dev.rollczi.litecommands.argument.suggester.SuggesterRegistry;
import dev.rollczi.litecommands.context.ContextResult;
import dev.rollczi.litecommands.cooldown.CooldownState;
Expand Down Expand Up @@ -68,6 +69,7 @@
import java.util.Set;
import java.util.Stack;
import java.util.TreeSet;
import java.util.UUID;
import java.util.Vector;
import panda.std.Option;

Expand Down Expand Up @@ -127,6 +129,7 @@ public static <SENDER, C extends PlatformSettings, B extends LiteCommandsBaseBui
.argument(BigDecimal.class, new BigDecimalArgumentResolver<>(messageRegistry))
.argument(Instant.class, new InstantArgumentResolver<>(messageRegistry))
.argument(LocalDateTime.class, new LocalDateTimeArgumentResolver<>(messageRegistry))
.argument(UUID.class, new UUIDArgumentResolver<>(messageRegistry))

.argument(upwards(Enum.class), new EnumArgumentResolver<>())

Expand Down

0 comments on commit 4fbdd29

Please sign in to comment.