@API(status = API.Status.STABLE)
    public @NonNull CompletableFuture<Optional<String>> parseCurrentFlag(
            final @NonNull CommandContext<@NonNull C> commandContext,
            final @NonNull CommandInput commandInput,
            final @NonNull Executor completionExecutor
    ) {
        /* If empty, nothing to do */
        if (commandInput.isEmpty()) {
            return CompletableFuture.completedFuture(Optional.empty());
        }

        final String lastInputValue = commandInput.lastRemainingToken();

        /* Parse, but ignore the result of parsing */
        final FlagParser parser = new FlagParser();
        final CompletableFuture<@NonNull ArgumentParseResult<Object>> result = parser.parse(commandContext, commandInput);

        return result.thenApplyAsync(parseResult -> {
            if (commandContext.contains(FLAG_CURSOR_KEY)) {
                commandInput.cursor(commandContext.get(FLAG_CURSOR_KEY));
            } else if (parser.lastParsedFlag() == null && commandInput.isEmpty()) {
                final int count = lastInputValue.length();
                commandInput.moveCursor(-count);
            }
            return Optional.ofNullable(parser.lastParsedFlag());
        }, completionExecutor);
    }
Parses command input to figure out what flag is currently being
typed at the end of the input queue. If no flag value is being
inputted, returns {@link Optional#empty()}.<br>
<br>
Will consume all but the last element from the input queue.

@param commandContext Command context
@param commandInput   The input arguments
@param completionExecutor The completion executor
@return current flag being typed, or {@code empty()} if none is
cloud-core/src/main/java/org/incendo/cloud/parser/flag/CommandFlagParser.java