Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ArgumentParser with 0 arguments doesn't function (flags) #379

Open
bergerkiller opened this issue Jun 15, 2022 · 1 comment
Open

ArgumentParser with 0 arguments doesn't function (flags) #379

bergerkiller opened this issue Jun 15, 2022 · 1 comment
Labels
bug Something isn't working

Comments

@bergerkiller
Copy link
Contributor

When you create your own ArgumentParser that returns 0 in getRequestedArgumentCount(), with the intention of it inspecting the command context to deduce the argument value from there, it doesnt work. I used one with my own flag, --nearest. But when I tried to run the command with --nearest, it gives an error that it expects an argument. Despite argument count being 0.

Another issue is that you can't have a variable number of argument values for a flag, but that's a different issue altogether and less important here.

If there is an alternative way to register a new flag with some sort of 'value supplier' or function CommandContext -> Value, that would be fine too. There's no suggestions and the queue isn't used, anyway, so using an ArgumentParser for this is a bit out of place as well.

Example code:

    private static class NearestParser implements ArgumentParser<CommandSender, NearPosition> {

        private final LocationArgument.LocationParser<CommandSender> locationParser = new LocationArgument.LocationParser<>();

        @Override
        public ArgumentParseResult<NearPosition> parse(
                final CommandContext<CommandSender> commandContext,
                final Queue<String> inputQueue
        ) {
            Queue<String> atSenderQueue = new LinkedList<>();
            atSenderQueue.add("~");
            atSenderQueue.add("~");
            atSenderQueue.add("~");
            ArgumentParseResult<Location> locationResult = this.locationParser.parse(commandContext, atSenderQueue);
            if (locationResult.getFailure().isPresent()) {
                return ArgumentParseResult.failure(
                        locationResult.getFailure().get()
                );
            }

            // Done!
            return ArgumentParseResult.success(new NearPosition(
                    locationResult.getParsedValue().get(),
                    128.0));
        }

        @Override
        public List<String> suggestions(
                final CommandContext<CommandSender> commandContext,
                final String input
        ) {
            return Collections.emptyList();
        }

        @Override
        public int getRequestedArgumentCount() {
            return 0;
        }
    }

    private static class NearArgument extends CommandArgument<CommandSender, NearPosition> {

        private NearArgument(String name) {
            super(true, name, new NearestParser(), "",
                    TypeToken.get(NearPosition.class),
                    null,
                    Collections.emptyList());
        }
    }

    private final CommandFlag<NearPosition> flagNearest = CommandFlag.newBuilder("nearest")
            .withArgument(new NearArgument("where"))
            .build();

    // Somewhere:
    builder = builder.flag(flagNearest);
@Citymonstret Citymonstret added the bug Something isn't working label Jun 2, 2024
@broccolai
Copy link
Member

Is this still relevant in cloud 2?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants