@Override
    public @NonNull CompletableFuture<@NonNull ArgumentParseResult<Either<U, V>>> parseFuture(
            final @NonNull CommandContext<@NonNull C> commandContext,
            final @NonNull CommandInput commandInput
    ) {
        final String input = commandInput.peekString();
        final int originalCursor = commandInput.cursor();

        return this.primary.parser().parseFuture(commandContext, commandInput).thenCompose(primaryResult -> {
            if (primaryResult.parsedValue().isPresent()) {
                return ArgumentParseResult.successFuture(Either.ofPrimary(primaryResult.parsedValue().get()));
            }

            // We need to restore the input if the first parser fails, so that the fallback parser gets access
            // to the unspoiled input.
            commandInput.cursor(originalCursor);

            return this.fallback.parser()
                    .parseFuture(commandContext, commandInput)
                    .thenApply(fallbackResult -> {
                        if (fallbackResult.parsedValue().isPresent()) {
                            return ArgumentParseResult.success(Either.ofFallback(fallbackResult.parsedValue().get()));
                        }
                        return ArgumentParseResult.failure(new EitherParseException(
                                primaryResult.failure().get(),
                                fallbackResult.failure().get(),
                                this.primary.valueType(),
                                this.fallback.valueType(),
                                commandContext,
                                input
                        ));
                    });
        });
    }
Returns the fallback parser.

@return the fallback parser
cloud-core/src/main/java/org/incendo/cloud/parser/standard/EitherParser.java