#!/usr/bin/env bash
#
# mn Bash Completion
# =======================
#
# Bash completion support for the `mn` command,
# generated by [picocli](https://picocli.info/) version 4.7.6.
#
# Installation
# ------------
#
# 1. Source all completion scripts in your .bash_profile
#
#   cd $YOUR_APP_HOME/bin
#   for f in $(find . -name "*_completion"); do line=". $(pwd)/$f"; grep "$line" ~/.bash_profile || echo "$line" >> ~/.bash_profile; done
#
# 2. Open a new bash console, and type `mn [TAB][TAB]`
#
# 1a. Alternatively, if you have [bash-completion](https://github.com/scop/bash-completion) installed:
#     Place this file in a `bash-completion.d` folder:
#
#   * /etc/bash-completion.d
#   * /usr/local/etc/bash-completion.d
#   * ~/bash-completion.d
#
# Documentation
# -------------
# The script is called by bash whenever [TAB] or [TAB][TAB] is pressed after
# 'mn (..)'. By reading entered command line parameters,
# it determines possible bash completions and writes them to the COMPREPLY variable.
# Bash then completes the user input if only one entry is listed in the variable or
# shows the options if more than one is listed in COMPREPLY.
#
# References
# ----------
# [1] http://stackoverflow.com/a/12495480/1440785
# [2] http://tiswww.case.edu/php/chet/bash/FAQ
# [3] https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html
# [4] http://zsh.sourceforge.net/Doc/Release/Options.html#index-COMPLETE_005fALIASES
# [5] https://stackoverflow.com/questions/17042057/bash-check-element-in-array-for-elements-in-another-array/17042655#17042655
# [6] https://www.gnu.org/software/bash/manual/html_node/Programmable-Completion.html#Programmable-Completion
# [7] https://stackoverflow.com/questions/3249432/can-a-bash-tab-completion-script-be-used-in-zsh/27853970#27853970
#

if [ -n "$BASH_VERSION" ]; then
  # Enable programmable completion facilities when using bash (see [3])
  shopt -s progcomp
elif [ -n "$ZSH_VERSION" ]; then
  # Make alias a distinct command for completion purposes when using zsh (see [4])
  setopt COMPLETE_ALIASES
  alias compopt=complete

  # Enable bash completion in zsh (see [7])
  # Only initialize completions module once to avoid unregistering existing completions.
  if ! type compdef > /dev/null; then
    autoload -U +X compinit && compinit
  fi
  autoload -U +X bashcompinit && bashcompinit
fi

# CompWordsContainsArray takes an array and then checks
# if all elements of this array are in the global COMP_WORDS array.
#
# Returns zero (no error) if all elements of the array are in the COMP_WORDS array,
# otherwise returns 1 (error).
function CompWordsContainsArray() {
  declare -a localArray
  localArray=("$@")
  local findme
  for findme in "${localArray[@]}"; do
    if ElementNotInCompWords "$findme"; then return 1; fi
  done
  return 0
}
function ElementNotInCompWords() {
  local findme="$1"
  local element
  for element in "${COMP_WORDS[@]}"; do
    if [[ "$findme" = "$element" ]]; then return 1; fi
  done
  return 0
}

# The `currentPositionalIndex` function calculates the index of the current positional parameter.
#
# currentPositionalIndex takes three parameters:
# the command name,
# a space-separated string with the names of options that take a parameter, and
# a space-separated string with the names of boolean options (that don't take any params).
# When done, this function echos the current positional index to std_out.
#
# Example usage:
# local currIndex=$(currentPositionalIndex "mysubcommand" "$ARG_OPTS" "$FLAG_OPTS")
function currentPositionalIndex() {
  local commandName="$1"
  local optionsWithArgs="$2"
  local booleanOptions="$3"
  local previousWord
  local result=0

  for i in $(seq $((COMP_CWORD - 1)) -1 0); do
    previousWord=${COMP_WORDS[i]}
    if [ "${previousWord}" = "$commandName" ]; then
      break
    fi
    if [[ "${optionsWithArgs}" =~ ${previousWord} ]]; then
      ((result-=2)) # Arg option and its value not counted as positional param
    elif [[ "${booleanOptions}" =~ ${previousWord} ]]; then
      ((result-=1)) # Flag option itself not counted as positional param
    fi
    ((result++))
  done
  echo "$result"
}

# compReplyArray generates a list of completion suggestions based on an array, ensuring all values are properly escaped.
#
# compReplyArray takes a single parameter: the array of options to be displayed
#
# The output is echoed to std_out, one option per line.
#
# Example usage:
# local options=("foo", "bar", "baz")
# local IFS=$'\n'
# COMPREPLY=($(compReplyArray "${options[@]}"))
function compReplyArray() {
  declare -a options
  options=("$@")
  local curr_word=${COMP_WORDS[COMP_CWORD]}
  local i
  local quoted
  local optionList=()

  for (( i=0; i<${#options[@]}; i++ )); do
    # Double escape, since we want escaped values, but compgen -W expands the argument
    printf -v quoted %q "${options[i]}"
    quoted=\'${quoted//\'/\'\\\'\'}\'

    optionList[i]=$quoted
  done

  # We also have to add another round of escaping to $curr_word.
  curr_word=${curr_word//\\/\\\\}
  curr_word=${curr_word//\'/\\\'}

  # Actually generate completions.
  local IFS=$'\n'
  echo -e "$(compgen -W "${optionList[*]}" -- "$curr_word")"
}

# Bash completion entry point function.
# _complete_mn finds which commands and subcommands have been specified
# on the command line and delegates to the appropriate function
# to generate possible options and subcommands for the last specified subcommand.
function _complete_mn() {
  # Edge case: if command line has no space after subcommand, then don't assume this subcommand is selected (remkop/picocli#1468).
  if [ "${COMP_LINE}" = "${COMP_WORDS[0]} create-app" ];    then _picocli_mn; return $?; fi
  if [ "${COMP_LINE}" = "${COMP_WORDS[0]} create-chatbot" ];    then _picocli_mn; return $?; fi
  if [ "${COMP_LINE}" = "${COMP_WORDS[0]} create-cli-app" ];    then _picocli_mn; return $?; fi
  if [ "${COMP_LINE}" = "${COMP_WORDS[0]} create-function-app" ];    then _picocli_mn; return $?; fi
  if [ "${COMP_LINE}" = "${COMP_WORDS[0]} create-grpc-app" ];    then _picocli_mn; return $?; fi
  if [ "${COMP_LINE}" = "${COMP_WORDS[0]} create-messaging-app" ];    then _picocli_mn; return $?; fi
  if [ "${COMP_LINE}" = "${COMP_WORDS[0]} create" ];    then _picocli_mn; return $?; fi
  if [ "${COMP_LINE}" = "${COMP_WORDS[0]} create-aws-lambda" ];    then _picocli_mn; return $?; fi

  # Find the longest sequence of subcommands and call the bash function for that subcommand.
  local cmds0=(create-app)
  local cmds1=(create-chatbot)
  local cmds2=(create-cli-app)
  local cmds3=(create-function-app)
  local cmds4=(create-grpc-app)
  local cmds5=(create-messaging-app)
  local cmds6=(create)
  local cmds7=(create-aws-lambda)

  if CompWordsContainsArray "${cmds7[@]}"; then _picocli_mn_createawslambda; return $?; fi
  if CompWordsContainsArray "${cmds6[@]}"; then _picocli_mn_create; return $?; fi
  if CompWordsContainsArray "${cmds5[@]}"; then _picocli_mn_createmessagingapp; return $?; fi
  if CompWordsContainsArray "${cmds4[@]}"; then _picocli_mn_creategrpcapp; return $?; fi
  if CompWordsContainsArray "${cmds3[@]}"; then _picocli_mn_createfunctionapp; return $?; fi
  if CompWordsContainsArray "${cmds2[@]}"; then _picocli_mn_createcliapp; return $?; fi
  if CompWordsContainsArray "${cmds1[@]}"; then _picocli_mn_createchatbot; return $?; fi
  if CompWordsContainsArray "${cmds0[@]}"; then _picocli_mn_createapp; return $?; fi

  # No subcommands were specified; generate completions for the top-level command.
  _picocli_mn; return $?;
}

# Generates completions for the options and subcommands of the `mn` command.
function _picocli_mn() {
  # Get completion data
  local curr_word=${COMP_WORDS[COMP_CWORD]}

  local commands="create-app create-chatbot create-cli-app create-function-app create-grpc-app create-messaging-app create create-aws-lambda"
  local flag_opts="-x --stacktrace -v --verbose -h --help -V --version"
  local arg_opts=""

  if [[ "${curr_word}" == -* ]]; then
    COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") )
  else
    local positionals=""
    local IFS=$'\n'
    COMPREPLY=( $(compgen -W "${commands// /$'\n'}${IFS}${positionals}" -- "${curr_word}") )
  fi
}

# Generates completions for the options and subcommands of the `create-app` subcommand.
function _picocli_mn_createapp() {
  # Get completion data
  local curr_word=${COMP_WORDS[COMP_CWORD]}
  local prev_word=${COMP_WORDS[COMP_CWORD-1]}

  local commands=""
  local flag_opts="-x --stacktrace -v --verbose -h --help -V --version -i --inplace --list-features"
  local arg_opts="-l --lang -t --test -b --build --jdk --java-version -f --features"
  local LANG_option_args=("java" "groovy" "kotlin") # --lang values
  local TEST_option_args=("junit" "spock" "kotest") # --test values
  local BUILDTOOL_option_args=("gradle" "gradle_kotlin" "maven") # --build values
  local javaVersion_option_args=("17" "21" "25") # --java-version values
  local FEATURE_option_args=("jdbc-ucp" "jdbc-tomcat" "jdbc-dbcp" "jdbc-hikari" "data-r2dbc" "security" "micrometer-appoptics" "dekorate-openshift" "jasync-sql" "gcp-logging" "object-storage-azure" "swagger-ui" "kapt" "coherence-session" "jetty-server" "rxjava2-http-client" "microstream-cache" "rxjava1" "coherence-distributed-configuration" "tracing-opentelemetry-gcp" "github-workflow-ci" "dynamodb" "spring-data-jpa" "data-azure-cosmos" "views-pebble" "http-client" "redis-lettuce" "sourcegen-generator" "cache-coherence" "micrometer-new-relic" "discovery-client" "langchain4j-ollama" "email-javamail" "rabbitmq" "langchain4j-azure" "cassandra" "langchain4j-mistralai" "langchain4j-openai" "discovery-core" "micrometer-stackdriver" "data-jdbc" "openrewrite" "management" "postgres" "email-mailjet" "hibernate-reactive-jpa" "arm" "sql-jdbi" "test-resources" "develocity" "aws-lambda-custom-runtime" "aws-alexa" "object-storage-local" "graphql" "micrometer-influx" "views-soy" "views-velocity" "mqtt" "micrometer-observation" "kotlin-extension-functions" "spring-boot" "dekorate-servicecatalog" "email-mailtrap" "redoc" "mqtt-hivemq" "mqttv3" "mcp-stdio" "r2dbc" "views-jte" "jms-core" "netflix-archaius" "langchain4j-store-pgvector" "junit-params" "azure-cosmos-db" "kubernetes-rxjava2-client" "config-consul" "opensearch-httpclient5" "langchain4j-bedrock" "micrometer-observation-http" "langchain4j-hugging-face" "mcp-client-langchain4j" "spring" "micrometer-prometheus" "groovy-json" "kubernetes" "object-storage-oracle-cloud" "micrometer-cloudwatch" "jax-rs" "openapi" "groovy-ginq" "views-react" "discovery-eureka" "asciidoctor" "serialization-bson" "gcp-secrets-manager" "mcp-http" "langchain4j-anthropic" "junit-platform-suite-engine" "langchain4j-googleai-gemini" "netflix-hystrix" "serialization-jackson" "microstream" "github-workflow-google-cloud-run-graalvm" "micrometer-dynatrace" "langchain4j-vertexai-gemini" "jobrunr-jobrunr" "flyway" "hamcrest" "groovy-datetime" "mysql" "multi-tenancy" "micronaut-test-rest-assured" "slf4j-simple-logger" "data-hibernate-reactive" "oracle-cloud-httpclient-netty" "cache-caffeine" "openapi-adoc" "reactor" "http-server-jdk" "graalvm" "http-client-jdk" "gitlab-workflow-ci" "dekorate-jaeger" "micrometer-prometheus-pushgateway" "azure-logging" "oracle-cloud-sdk" "tracing-opentelemetry-zipkin" "micrometer-jmx" "amazon-cognito" "netflix-ribbon" "gcp-cloud-trace" "jackson-databind" "email-amazon-ses" "micrometer-humio" "hibernate-jpa" "tracing-opentelemetry-exporter-logging" "oracle" "openapi-explorer" "security-jwt" "chatbots-telegram-http" "hibernate-validator" "jspecify" "kubernetes-informer" "github-workflow-azure-container-instance-graalvm" "validation" "dekorate-prometheus" "github-workflow-docker-registry" "mockserver-client-java" "views-fieldset" "retry" "aws-lambda" "aws-parameter-store" "assertj" "github-workflow-oracle-cloud-functions-graalvm" "tracing-opentelemetry-jaeger" "vertx-mysql-client" "json-smart" "oracle-cloud-logging" "github-workflow-graal-docker-registry" "json-path" "jms-sqs" "knative" "oracle-function" "http-session" "jib" "micrometer-annotation" "aws-codebuild-workflow-ci" "rss" "elasticsearch" "nats" "log4j2" "tracing-opentelemetry-exporter-otlp" "amazon-api-gateway" "rxjava2" "microstream-rest" "azure-key-vault" "langchain4j-store-qdrant" "coherence-data" "data-spring-jdbc" "crac" "object-storage-gcp" "micrometer-wavefront" "ksp" "aws-secrets-manager" "localstack" "jms-activemq-artemis" "kubernetes-client" "langchain4j-vertexai" "tracing-opentelemetry-xray" "problem-json" "google-cloud-workflow-ci" "websocket" "data-jpa" "acme" "amazon-cloudwatch-logging" "gcp-pubsub" "views-rocker" "lombok" "micrometer-ganglia" "data-mongodb" "micrometer-oracle-cloud" "views-thymeleaf" "aws-v2-sdk" "neo4j-bolt" "oracle-cloud-atp" "eclipsestore-rest" "liquibase-slf4j" "mcp-client-java-sdk" "object-storage-aws" "spring-web" "mongo-reactive" "config-kubernetes" "json-schema-generator" "dekorate-kubernetes" "vertx-pg-client" "h2" "jackson-xml" "awaitility" "kafka-streams" "control-panel" "json-schema-validation" "rxjava3" "jms-activemq-classic" "langchain4j-store-oracle" "groovy-xml" "sqlserver" "x86" "mongo-sync" "security-ldap" "azure-tracing" "groovy-dateutil" "guice" "groovy-sql" "jooq" "cache-infinispan" "micrometer-statsd" "eclipsestore" "github-workflow-google-cloud-run" "langchain4j-store-neo4j" "jakarta-data" "rss-itunes-podcast" "micrometer-graphite" "test-netty-leak" "micrometer-elastic" "micrometer-azure-monitor" "jmx" "htmx" "logback" "kafka" "micronaut-http-validation" "groovy-toml" "nullaway" "micrometer-datadog" "hibernate-jpamodelgen" "slf4j-simple" "amazon-api-gateway-http" "tomcat-server" "discovery-kubernetes" "coherence" "google-cloud-function" "mockito" "dekorate-halkyon" "security-csrf" "rxjava3-http-client" "reactor-http-client" "jul-to-slf4j" "chatbots-basecamp-http" "json-schema" "email-template" "rapidoc" "tracing-jaeger" "undertow-server" "micronaut-aot" "micrometer-atlas" "liquibase" "data-mongodb-reactive" "email-postmark" "oracle-cloud-devops-build-ci" "aws-lambda-events-serde" "kubernetes-reactor-client" "github-workflow-oracle-cloud-functions" "cache-ehcache" "annotation-api" "views-handlebars" "opensearch-amazon" "langchain4j-store-opensearch" "micrometer-kairos" "jrebel" "groovy-yaml" "oracle-cloud-vault" "micronaut-aop" "cache-hazelcast" "tracing-zipkin" "serialization-jsonp" "opensearch-restclient" "graalpy" "langchain4j-store-elasticsearch" "azure-function" "github-workflow-azure-container-instance" "langchain4j-store-mongodb-atlas" "buildless" "spring-data-jdbc" "views-freemarker" "netty-server" "dekorate-knative" "mariadb" "jms-oracle-aq" "discovery-consul" "email-sendgrid" "http-poja" "micrometer-signalfx" "security-oauth2" "security-session" "aws-cdk" "ktor" "testcontainers" "shade" "toml" "config4k" "properties" "yaml") # --features values

  type compopt &>/dev/null && compopt +o default

  case ${prev_word} in
    -l|--lang)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${LANG_option_args[@]}" ) )
      return $?
      ;;
    -t|--test)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${TEST_option_args[@]}" ) )
      return $?
      ;;
    -b|--build)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${BUILDTOOL_option_args[@]}" ) )
      return $?
      ;;
    --jdk|--java-version)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${javaVersion_option_args[@]}" ) )
      return $?
      ;;
    -f|--features)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${FEATURE_option_args[@]}" ) )
      return $?
      ;;
  esac

  if [[ "${curr_word}" == -* ]]; then
    COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") )
  else
    local positionals=""
    local IFS=$'\n'
    COMPREPLY=( $(compgen -W "${commands// /$'\n'}${IFS}${positionals}" -- "${curr_word}") )
  fi
}

# Generates completions for the options and subcommands of the `create-chatbot` subcommand.
function _picocli_mn_createchatbot() {
  # Get completion data
  local curr_word=${COMP_WORDS[COMP_CWORD]}

  local commands=""
  local flag_opts="-x --stacktrace -v --verbose -h --help -V --version"
  local arg_opts=""

  if [[ "${curr_word}" == -* ]]; then
    COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") )
  else
    local positionals=""
    local IFS=$'\n'
    COMPREPLY=( $(compgen -W "${commands// /$'\n'}${IFS}${positionals}" -- "${curr_word}") )
  fi
}

# Generates completions for the options and subcommands of the `create-cli-app` subcommand.
function _picocli_mn_createcliapp() {
  # Get completion data
  local curr_word=${COMP_WORDS[COMP_CWORD]}
  local prev_word=${COMP_WORDS[COMP_CWORD-1]}

  local commands=""
  local flag_opts="-x --stacktrace -v --verbose -h --help -V --version -i --inplace --list-features"
  local arg_opts="-l --lang -t --test -b --build --jdk --java-version -f --features"
  local LANG_option_args=("java" "groovy" "kotlin") # --lang values
  local TEST_option_args=("junit" "spock" "kotest") # --test values
  local BUILDTOOL_option_args=("gradle" "gradle_kotlin" "maven") # --build values
  local javaVersion_option_args=("17" "21" "25") # --java-version values
  local FEATURE_option_args=("jdbc-ucp" "jdbc-tomcat" "jdbc-dbcp" "jdbc-hikari" "data-r2dbc" "security" "jasync-sql" "gcp-logging" "object-storage-azure" "kapt" "coherence-session" "rxjava2-http-client" "microstream-cache" "rxjava1" "github-workflow-ci" "dynamodb" "spring-data-jpa" "data-azure-cosmos" "http-client" "redis-lettuce" "sourcegen-generator" "cache-coherence" "langchain4j-ollama" "email-javamail" "rabbitmq" "langchain4j-azure" "cassandra" "langchain4j-mistralai" "langchain4j-openai" "data-jdbc" "openrewrite" "postgres" "email-mailjet" "hibernate-reactive-jpa" "arm" "sql-jdbi" "test-resources" "develocity" "object-storage-local" "graphql" "mqtt" "kotlin-extension-functions" "spring-boot" "email-mailtrap" "mqtt-hivemq" "mqttv3" "mcp-stdio" "r2dbc" "jms-core" "langchain4j-store-pgvector" "junit-params" "azure-cosmos-db" "kubernetes-rxjava2-client" "opensearch-httpclient5" "langchain4j-bedrock" "langchain4j-hugging-face" "mcp-client-langchain4j" "spring" "groovy-json" "object-storage-oracle-cloud" "groovy-ginq" "asciidoctor" "serialization-bson" "mcp-http" "langchain4j-anthropic" "junit-platform-suite-engine" "langchain4j-googleai-gemini" "netflix-hystrix" "serialization-jackson" "microstream" "github-workflow-google-cloud-run-graalvm" "langchain4j-vertexai-gemini" "jobrunr-jobrunr" "flyway" "hamcrest" "groovy-datetime" "mysql" "multi-tenancy" "micronaut-test-rest-assured" "slf4j-simple-logger" "data-hibernate-reactive" "oracle-cloud-httpclient-netty" "cache-caffeine" "reactor" "graalvm" "http-client-jdk" "gitlab-workflow-ci" "azure-logging" "oracle-cloud-sdk" "netflix-ribbon" "gcp-cloud-trace" "jackson-databind" "email-amazon-ses" "hibernate-jpa" "oracle" "security-jwt" "hibernate-validator" "jspecify" "kubernetes-informer" "github-workflow-azure-container-instance-graalvm" "validation" "github-workflow-docker-registry" "mockserver-client-java" "retry" "assertj" "github-workflow-oracle-cloud-functions-graalvm" "vertx-mysql-client" "json-smart" "oracle-cloud-logging" "github-workflow-graal-docker-registry" "json-path" "jms-sqs" "http-session" "jib" "aws-codebuild-workflow-ci" "elasticsearch" "nats" "log4j2" "rxjava2" "microstream-rest" "langchain4j-store-qdrant" "coherence-data" "data-spring-jdbc" "crac" "object-storage-gcp" "ksp" "localstack" "jms-activemq-artemis" "kubernetes-client" "langchain4j-vertexai" "problem-json" "google-cloud-workflow-ci" "websocket" "data-jpa" "amazon-cloudwatch-logging" "gcp-pubsub" "lombok" "data-mongodb" "aws-v2-sdk" "neo4j-bolt" "oracle-cloud-atp" "eclipsestore-rest" "liquibase-slf4j" "mcp-client-java-sdk" "object-storage-aws" "mongo-reactive" "json-schema-generator" "vertx-pg-client" "h2" "jackson-xml" "awaitility" "kafka-streams" "json-schema-validation" "rxjava3" "jms-activemq-classic" "langchain4j-store-oracle" "groovy-xml" "sqlserver" "x86" "mongo-sync" "security-ldap" "azure-tracing" "groovy-dateutil" "guice" "groovy-sql" "jooq" "cache-infinispan" "eclipsestore" "github-workflow-google-cloud-run" "langchain4j-store-neo4j" "jakarta-data" "test-netty-leak" "logback" "kafka" "groovy-toml" "nullaway" "hibernate-jpamodelgen" "slf4j-simple" "coherence" "mockito" "security-csrf" "rxjava3-http-client" "reactor-http-client" "jul-to-slf4j" "json-schema" "email-template" "liquibase" "data-mongodb-reactive" "email-postmark" "oracle-cloud-devops-build-ci" "aws-lambda-events-serde" "kubernetes-reactor-client" "github-workflow-oracle-cloud-functions" "cache-ehcache" "annotation-api" "opensearch-amazon" "langchain4j-store-opensearch" "jrebel" "groovy-yaml" "micronaut-aop" "cache-hazelcast" "serialization-jsonp" "opensearch-restclient" "graalpy" "langchain4j-store-elasticsearch" "github-workflow-azure-container-instance" "langchain4j-store-mongodb-atlas" "buildless" "spring-data-jdbc" "mariadb" "jms-oracle-aq" "email-sendgrid" "security-oauth2" "security-session" "testcontainers" "shade" "toml" "config4k" "properties" "yaml") # --features values

  type compopt &>/dev/null && compopt +o default

  case ${prev_word} in
    -l|--lang)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${LANG_option_args[@]}" ) )
      return $?
      ;;
    -t|--test)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${TEST_option_args[@]}" ) )
      return $?
      ;;
    -b|--build)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${BUILDTOOL_option_args[@]}" ) )
      return $?
      ;;
    --jdk|--java-version)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${javaVersion_option_args[@]}" ) )
      return $?
      ;;
    -f|--features)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${FEATURE_option_args[@]}" ) )
      return $?
      ;;
  esac

  if [[ "${curr_word}" == -* ]]; then
    COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") )
  else
    local positionals=""
    local IFS=$'\n'
    COMPREPLY=( $(compgen -W "${commands// /$'\n'}${IFS}${positionals}" -- "${curr_word}") )
  fi
}

# Generates completions for the options and subcommands of the `create-function-app` subcommand.
function _picocli_mn_createfunctionapp() {
  # Get completion data
  local curr_word=${COMP_WORDS[COMP_CWORD]}
  local prev_word=${COMP_WORDS[COMP_CWORD-1]}

  local commands=""
  local flag_opts="-x --stacktrace -v --verbose -h --help -V --version -i --inplace --list-features"
  local arg_opts="-l --lang -t --test -b --build --jdk --java-version -f --features"
  local LANG_option_args=("java" "groovy" "kotlin") # --lang values
  local TEST_option_args=("junit" "spock" "kotest") # --test values
  local BUILDTOOL_option_args=("gradle" "gradle_kotlin" "maven") # --build values
  local javaVersion_option_args=("17" "21" "25") # --java-version values
  local FEATURE_option_args=("jdbc-ucp" "jdbc-tomcat" "jdbc-dbcp" "jdbc-hikari" "data-r2dbc" "security" "jasync-sql" "chatbots-basecamp-gcp-function" "gcp-logging" "object-storage-azure" "kapt" "coherence-session" "rxjava2-http-client" "microstream-cache" "rxjava1" "coherence-distributed-configuration" "tracing-opentelemetry-gcp" "github-workflow-ci" "dynamodb" "spring-data-jpa" "data-azure-cosmos" "http-client" "redis-lettuce" "sourcegen-generator" "cache-coherence" "discovery-client" "langchain4j-ollama" "email-javamail" "rabbitmq" "langchain4j-azure" "cassandra" "langchain4j-mistralai" "langchain4j-openai" "discovery-core" "data-jdbc" "openrewrite" "postgres" "email-mailjet" "hibernate-reactive-jpa" "arm" "sql-jdbi" "test-resources" "develocity" "aws-lambda-custom-runtime" "aws-alexa" "object-storage-local" "graphql" "mqtt" "kotlin-extension-functions" "spring-boot" "email-mailtrap" "mqtt-hivemq" "mqttv3" "mcp-stdio" "r2dbc" "jms-core" "netflix-archaius" "langchain4j-store-pgvector" "junit-params" "azure-cosmos-db" "kubernetes-rxjava2-client" "config-consul" "opensearch-httpclient5" "langchain4j-bedrock" "langchain4j-hugging-face" "mcp-client-langchain4j" "spring" "groovy-json" "object-storage-oracle-cloud" "groovy-ginq" "discovery-eureka" "asciidoctor" "serialization-bson" "gcp-secrets-manager" "mcp-http" "chatbots-basecamp-lambda" "langchain4j-anthropic" "junit-platform-suite-engine" "langchain4j-googleai-gemini" "netflix-hystrix" "serialization-jackson" "microstream" "github-workflow-google-cloud-run-graalvm" "langchain4j-vertexai-gemini" "jobrunr-jobrunr" "aws-lambda-s3-event-notification" "flyway" "hamcrest" "groovy-datetime" "mysql" "multi-tenancy" "micronaut-test-rest-assured" "slf4j-simple-logger" "data-hibernate-reactive" "oracle-cloud-httpclient-netty" "cache-caffeine" "reactor" "graalvm" "http-client-jdk" "gitlab-workflow-ci" "azure-logging" "chatbots-telegram-azure-function" "oracle-cloud-sdk" "tracing-opentelemetry-zipkin" "netflix-ribbon" "gcp-cloud-trace" "jackson-databind" "email-amazon-ses" "hibernate-jpa" "tracing-opentelemetry-exporter-logging" "oracle" "security-jwt" "hibernate-validator" "jspecify" "kubernetes-informer" "github-workflow-azure-container-instance-graalvm" "validation" "github-workflow-docker-registry" "mockserver-client-java" "retry" "aws-lambda" "aws-parameter-store" "assertj" "github-workflow-oracle-cloud-functions-graalvm" "tracing-opentelemetry-jaeger" "vertx-mysql-client" "json-smart" "oracle-cloud-logging" "github-workflow-graal-docker-registry" "json-path" "jms-sqs" "oracle-function" "http-session" "jib" "aws-codebuild-workflow-ci" "elasticsearch" "nats" "log4j2" "tracing-opentelemetry-exporter-otlp" "amazon-api-gateway" "rxjava2" "microstream-rest" "azure-key-vault" "aws-lambda-scheduled-event" "langchain4j-store-qdrant" "coherence-data" "data-spring-jdbc" "object-storage-gcp" "ksp" "aws-secrets-manager" "localstack" "jms-activemq-artemis" "kubernetes-client" "langchain4j-vertexai" "tracing-opentelemetry-xray" "problem-json" "google-cloud-workflow-ci" "websocket" "data-jpa" "amazon-cloudwatch-logging" "gcp-pubsub" "lombok" "data-mongodb" "aws-v2-sdk" "neo4j-bolt" "oracle-cloud-atp" "eclipsestore-rest" "liquibase-slf4j" "mcp-client-java-sdk" "chatbots-basecamp-azure-function" "object-storage-aws" "mongo-reactive" "json-schema-generator" "vertx-pg-client" "h2" "jackson-xml" "awaitility" "kafka-streams" "json-schema-validation" "rxjava3" "jms-activemq-classic" "langchain4j-store-oracle" "chatbots-telegram-gcp-function" "groovy-xml" "sqlserver" "x86" "mongo-sync" "security-ldap" "azure-tracing" "groovy-dateutil" "guice" "groovy-sql" "jooq" "cache-infinispan" "eclipsestore" "github-workflow-google-cloud-run" "langchain4j-store-neo4j" "jakarta-data" "test-netty-leak" "logback" "kafka" "groovy-toml" "nullaway" "hibernate-jpamodelgen" "slf4j-simple" "amazon-api-gateway-http" "discovery-kubernetes" "coherence" "google-cloud-function" "mockito" "security-csrf" "rxjava3-http-client" "reactor-http-client" "jul-to-slf4j" "json-schema" "email-template" "tracing-jaeger" "liquibase" "data-mongodb-reactive" "email-postmark" "oracle-cloud-devops-build-ci" "aws-lambda-events-serde" "kubernetes-reactor-client" "github-workflow-oracle-cloud-functions" "cache-ehcache" "annotation-api" "opensearch-amazon" "langchain4j-store-opensearch" "jrebel" "groovy-yaml" "oracle-cloud-vault" "micronaut-aop" "cache-hazelcast" "tracing-zipkin" "serialization-jsonp" "opensearch-restclient" "aws-lambda-function-url" "graalpy" "langchain4j-store-elasticsearch" "azure-function" "github-workflow-azure-container-instance" "langchain4j-store-mongodb-atlas" "buildless" "spring-data-jdbc" "google-cloud-function-cloudevents" "chatbots-telegram-lambda" "mariadb" "jms-oracle-aq" "discovery-consul" "email-sendgrid" "security-oauth2" "security-session" "aws-cdk" "testcontainers" "shade" "toml" "config4k" "properties" "yaml") # --features values

  type compopt &>/dev/null && compopt +o default

  case ${prev_word} in
    -l|--lang)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${LANG_option_args[@]}" ) )
      return $?
      ;;
    -t|--test)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${TEST_option_args[@]}" ) )
      return $?
      ;;
    -b|--build)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${BUILDTOOL_option_args[@]}" ) )
      return $?
      ;;
    --jdk|--java-version)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${javaVersion_option_args[@]}" ) )
      return $?
      ;;
    -f|--features)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${FEATURE_option_args[@]}" ) )
      return $?
      ;;
  esac

  if [[ "${curr_word}" == -* ]]; then
    COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") )
  else
    local positionals=""
    local IFS=$'\n'
    COMPREPLY=( $(compgen -W "${commands// /$'\n'}${IFS}${positionals}" -- "${curr_word}") )
  fi
}

# Generates completions for the options and subcommands of the `create-grpc-app` subcommand.
function _picocli_mn_creategrpcapp() {
  # Get completion data
  local curr_word=${COMP_WORDS[COMP_CWORD]}
  local prev_word=${COMP_WORDS[COMP_CWORD-1]}

  local commands=""
  local flag_opts="-x --stacktrace -v --verbose -h --help -V --version -i --inplace --list-features"
  local arg_opts="-l --lang -t --test -b --build --jdk --java-version -f --features"
  local LANG_option_args=("java" "groovy" "kotlin") # --lang values
  local TEST_option_args=("junit" "spock" "kotest") # --test values
  local BUILDTOOL_option_args=("gradle" "gradle_kotlin" "maven") # --build values
  local javaVersion_option_args=("17" "21" "25") # --java-version values
  local FEATURE_option_args=("jdbc-ucp" "jdbc-tomcat" "jdbc-dbcp" "jdbc-hikari" "data-r2dbc" "security" "dekorate-openshift" "jasync-sql" "gcp-logging" "object-storage-azure" "kapt" "coherence-session" "rxjava2-http-client" "microstream-cache" "rxjava1" "coherence-distributed-configuration" "tracing-opentelemetry-gcp" "github-workflow-ci" "dynamodb" "spring-data-jpa" "data-azure-cosmos" "http-client" "redis-lettuce" "sourcegen-generator" "cache-coherence" "discovery-client" "langchain4j-ollama" "email-javamail" "rabbitmq" "langchain4j-azure" "cassandra" "langchain4j-mistralai" "langchain4j-openai" "discovery-core" "data-jdbc" "openrewrite" "postgres" "email-mailjet" "hibernate-reactive-jpa" "arm" "sql-jdbi" "test-resources" "develocity" "object-storage-local" "graphql" "mqtt" "kotlin-extension-functions" "spring-boot" "dekorate-servicecatalog" "email-mailtrap" "mqtt-hivemq" "mqttv3" "mcp-stdio" "r2dbc" "jms-core" "netflix-archaius" "langchain4j-store-pgvector" "junit-params" "azure-cosmos-db" "kubernetes-rxjava2-client" "config-consul" "opensearch-httpclient5" "langchain4j-bedrock" "langchain4j-hugging-face" "mcp-client-langchain4j" "spring" "groovy-json" "kubernetes" "object-storage-oracle-cloud" "groovy-ginq" "discovery-eureka" "asciidoctor" "serialization-bson" "gcp-secrets-manager" "mcp-http" "langchain4j-anthropic" "junit-platform-suite-engine" "langchain4j-googleai-gemini" "netflix-hystrix" "serialization-jackson" "microstream" "github-workflow-google-cloud-run-graalvm" "langchain4j-vertexai-gemini" "jobrunr-jobrunr" "flyway" "hamcrest" "groovy-datetime" "mysql" "multi-tenancy" "micronaut-test-rest-assured" "slf4j-simple-logger" "data-hibernate-reactive" "oracle-cloud-httpclient-netty" "cache-caffeine" "reactor" "graalvm" "http-client-jdk" "gitlab-workflow-ci" "dekorate-jaeger" "azure-logging" "oracle-cloud-sdk" "tracing-opentelemetry-zipkin" "netflix-ribbon" "gcp-cloud-trace" "jackson-databind" "email-amazon-ses" "hibernate-jpa" "tracing-opentelemetry-exporter-logging" "oracle" "security-jwt" "hibernate-validator" "jspecify" "kubernetes-informer" "github-workflow-azure-container-instance-graalvm" "validation" "dekorate-prometheus" "github-workflow-docker-registry" "mockserver-client-java" "retry" "aws-parameter-store" "assertj" "github-workflow-oracle-cloud-functions-graalvm" "tracing-opentelemetry-jaeger" "vertx-mysql-client" "json-smart" "oracle-cloud-logging" "github-workflow-graal-docker-registry" "json-path" "jms-sqs" "knative" "http-session" "jib" "aws-codebuild-workflow-ci" "elasticsearch" "nats" "log4j2" "tracing-opentelemetry-exporter-otlp" "rxjava2" "microstream-rest" "azure-key-vault" "langchain4j-store-qdrant" "coherence-data" "data-spring-jdbc" "object-storage-gcp" "ksp" "aws-secrets-manager" "localstack" "jms-activemq-artemis" "kubernetes-client" "langchain4j-vertexai" "tracing-opentelemetry-xray" "problem-json" "google-cloud-workflow-ci" "websocket" "data-jpa" "amazon-cloudwatch-logging" "gcp-pubsub" "lombok" "data-mongodb" "aws-v2-sdk" "neo4j-bolt" "oracle-cloud-atp" "eclipsestore-rest" "liquibase-slf4j" "mcp-client-java-sdk" "object-storage-aws" "mongo-reactive" "config-kubernetes" "json-schema-generator" "dekorate-kubernetes" "vertx-pg-client" "h2" "jackson-xml" "awaitility" "kafka-streams" "json-schema-validation" "rxjava3" "jms-activemq-classic" "langchain4j-store-oracle" "groovy-xml" "sqlserver" "x86" "mongo-sync" "security-ldap" "azure-tracing" "groovy-dateutil" "guice" "groovy-sql" "jooq" "cache-infinispan" "eclipsestore" "github-workflow-google-cloud-run" "langchain4j-store-neo4j" "jakarta-data" "test-netty-leak" "logback" "kafka" "groovy-toml" "nullaway" "hibernate-jpamodelgen" "slf4j-simple" "discovery-kubernetes" "coherence" "mockito" "dekorate-halkyon" "security-csrf" "rxjava3-http-client" "reactor-http-client" "jul-to-slf4j" "json-schema" "email-template" "tracing-jaeger" "liquibase" "data-mongodb-reactive" "email-postmark" "oracle-cloud-devops-build-ci" "aws-lambda-events-serde" "kubernetes-reactor-client" "github-workflow-oracle-cloud-functions" "cache-ehcache" "annotation-api" "opensearch-amazon" "langchain4j-store-opensearch" "jrebel" "groovy-yaml" "oracle-cloud-vault" "micronaut-aop" "cache-hazelcast" "tracing-zipkin" "serialization-jsonp" "opensearch-restclient" "graalpy" "langchain4j-store-elasticsearch" "github-workflow-azure-container-instance" "langchain4j-store-mongodb-atlas" "buildless" "spring-data-jdbc" "dekorate-knative" "mariadb" "jms-oracle-aq" "discovery-consul" "email-sendgrid" "security-oauth2" "security-session" "testcontainers" "shade" "toml" "config4k" "properties" "yaml") # --features values

  type compopt &>/dev/null && compopt +o default

  case ${prev_word} in
    -l|--lang)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${LANG_option_args[@]}" ) )
      return $?
      ;;
    -t|--test)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${TEST_option_args[@]}" ) )
      return $?
      ;;
    -b|--build)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${BUILDTOOL_option_args[@]}" ) )
      return $?
      ;;
    --jdk|--java-version)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${javaVersion_option_args[@]}" ) )
      return $?
      ;;
    -f|--features)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${FEATURE_option_args[@]}" ) )
      return $?
      ;;
  esac

  if [[ "${curr_word}" == -* ]]; then
    COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") )
  else
    local positionals=""
    local IFS=$'\n'
    COMPREPLY=( $(compgen -W "${commands// /$'\n'}${IFS}${positionals}" -- "${curr_word}") )
  fi
}

# Generates completions for the options and subcommands of the `create-messaging-app` subcommand.
function _picocli_mn_createmessagingapp() {
  # Get completion data
  local curr_word=${COMP_WORDS[COMP_CWORD]}
  local prev_word=${COMP_WORDS[COMP_CWORD-1]}

  local commands=""
  local flag_opts="-x --stacktrace -v --verbose -h --help -V --version -i --inplace --list-features"
  local arg_opts="-l --lang -t --test -b --build --jdk --java-version -f --features"
  local LANG_option_args=("java" "groovy" "kotlin") # --lang values
  local TEST_option_args=("junit" "spock" "kotest") # --test values
  local BUILDTOOL_option_args=("gradle" "gradle_kotlin" "maven") # --build values
  local javaVersion_option_args=("17" "21" "25") # --java-version values
  local FEATURE_option_args=("jdbc-ucp" "jdbc-tomcat" "jdbc-dbcp" "jdbc-hikari" "data-r2dbc" "security" "jasync-sql" "gcp-logging" "object-storage-azure" "kapt" "coherence-session" "rxjava2-http-client" "microstream-cache" "rxjava1" "coherence-distributed-configuration" "tracing-opentelemetry-gcp" "github-workflow-ci" "dynamodb" "spring-data-jpa" "data-azure-cosmos" "http-client" "redis-lettuce" "sourcegen-generator" "cache-coherence" "discovery-client" "langchain4j-ollama" "email-javamail" "rabbitmq" "langchain4j-azure" "cassandra" "langchain4j-mistralai" "langchain4j-openai" "discovery-core" "data-jdbc" "openrewrite" "postgres" "email-mailjet" "hibernate-reactive-jpa" "arm" "sql-jdbi" "test-resources" "develocity" "object-storage-local" "graphql" "mqtt" "kotlin-extension-functions" "spring-boot" "email-mailtrap" "mqtt-hivemq" "mqttv3" "mcp-stdio" "r2dbc" "jms-core" "netflix-archaius" "langchain4j-store-pgvector" "junit-params" "azure-cosmos-db" "kubernetes-rxjava2-client" "config-consul" "opensearch-httpclient5" "langchain4j-bedrock" "langchain4j-hugging-face" "mcp-client-langchain4j" "spring" "groovy-json" "object-storage-oracle-cloud" "groovy-ginq" "discovery-eureka" "asciidoctor" "serialization-bson" "gcp-secrets-manager" "mcp-http" "langchain4j-anthropic" "junit-platform-suite-engine" "langchain4j-googleai-gemini" "netflix-hystrix" "serialization-jackson" "microstream" "github-workflow-google-cloud-run-graalvm" "langchain4j-vertexai-gemini" "jobrunr-jobrunr" "flyway" "hamcrest" "groovy-datetime" "mysql" "multi-tenancy" "micronaut-test-rest-assured" "slf4j-simple-logger" "data-hibernate-reactive" "oracle-cloud-httpclient-netty" "cache-caffeine" "reactor" "graalvm" "http-client-jdk" "gitlab-workflow-ci" "azure-logging" "oracle-cloud-sdk" "tracing-opentelemetry-zipkin" "netflix-ribbon" "gcp-cloud-trace" "jackson-databind" "email-amazon-ses" "hibernate-jpa" "tracing-opentelemetry-exporter-logging" "oracle" "security-jwt" "hibernate-validator" "jspecify" "kubernetes-informer" "github-workflow-azure-container-instance-graalvm" "validation" "github-workflow-docker-registry" "mockserver-client-java" "retry" "aws-parameter-store" "assertj" "github-workflow-oracle-cloud-functions-graalvm" "tracing-opentelemetry-jaeger" "vertx-mysql-client" "json-smart" "oracle-cloud-logging" "github-workflow-graal-docker-registry" "json-path" "jms-sqs" "http-session" "jib" "aws-codebuild-workflow-ci" "elasticsearch" "nats" "log4j2" "tracing-opentelemetry-exporter-otlp" "rxjava2" "microstream-rest" "azure-key-vault" "langchain4j-store-qdrant" "coherence-data" "data-spring-jdbc" "object-storage-gcp" "ksp" "aws-secrets-manager" "localstack" "jms-activemq-artemis" "kubernetes-client" "langchain4j-vertexai" "tracing-opentelemetry-xray" "problem-json" "google-cloud-workflow-ci" "websocket" "data-jpa" "amazon-cloudwatch-logging" "gcp-pubsub" "lombok" "data-mongodb" "aws-v2-sdk" "neo4j-bolt" "oracle-cloud-atp" "eclipsestore-rest" "liquibase-slf4j" "mcp-client-java-sdk" "object-storage-aws" "mongo-reactive" "config-kubernetes" "json-schema-generator" "vertx-pg-client" "h2" "jackson-xml" "awaitility" "kafka-streams" "json-schema-validation" "rxjava3" "jms-activemq-classic" "langchain4j-store-oracle" "groovy-xml" "sqlserver" "x86" "mongo-sync" "security-ldap" "azure-tracing" "groovy-dateutil" "guice" "groovy-sql" "jooq" "cache-infinispan" "eclipsestore" "github-workflow-google-cloud-run" "langchain4j-store-neo4j" "jakarta-data" "test-netty-leak" "logback" "kafka" "groovy-toml" "nullaway" "hibernate-jpamodelgen" "slf4j-simple" "discovery-kubernetes" "coherence" "mockito" "security-csrf" "rxjava3-http-client" "reactor-http-client" "jul-to-slf4j" "json-schema" "email-template" "tracing-jaeger" "liquibase" "data-mongodb-reactive" "email-postmark" "oracle-cloud-devops-build-ci" "aws-lambda-events-serde" "kubernetes-reactor-client" "github-workflow-oracle-cloud-functions" "cache-ehcache" "annotation-api" "opensearch-amazon" "langchain4j-store-opensearch" "jrebel" "groovy-yaml" "oracle-cloud-vault" "micronaut-aop" "cache-hazelcast" "tracing-zipkin" "serialization-jsonp" "opensearch-restclient" "graalpy" "langchain4j-store-elasticsearch" "github-workflow-azure-container-instance" "langchain4j-store-mongodb-atlas" "buildless" "spring-data-jdbc" "mariadb" "jms-oracle-aq" "discovery-consul" "email-sendgrid" "security-oauth2" "security-session" "testcontainers" "shade" "toml" "config4k" "properties" "yaml") # --features values

  type compopt &>/dev/null && compopt +o default

  case ${prev_word} in
    -l|--lang)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${LANG_option_args[@]}" ) )
      return $?
      ;;
    -t|--test)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${TEST_option_args[@]}" ) )
      return $?
      ;;
    -b|--build)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${BUILDTOOL_option_args[@]}" ) )
      return $?
      ;;
    --jdk|--java-version)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${javaVersion_option_args[@]}" ) )
      return $?
      ;;
    -f|--features)
      local IFS=$'\n'
      COMPREPLY=( $( compReplyArray "${FEATURE_option_args[@]}" ) )
      return $?
      ;;
  esac

  if [[ "${curr_word}" == -* ]]; then
    COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") )
  else
    local positionals=""
    local IFS=$'\n'
    COMPREPLY=( $(compgen -W "${commands// /$'\n'}${IFS}${positionals}" -- "${curr_word}") )
  fi
}

# Generates completions for the options and subcommands of the `create` subcommand.
function _picocli_mn_create() {
  # Get completion data
  local curr_word=${COMP_WORDS[COMP_CWORD]}

  local commands=""
  local flag_opts="-x --stacktrace -v --verbose -h --help -V --version"
  local arg_opts=""

  if [[ "${curr_word}" == -* ]]; then
    COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") )
  else
    local positionals=""
    local IFS=$'\n'
    COMPREPLY=( $(compgen -W "${commands// /$'\n'}${IFS}${positionals}" -- "${curr_word}") )
  fi
}

# Generates completions for the options and subcommands of the `create-aws-lambda` subcommand.
function _picocli_mn_createawslambda() {
  # Get completion data
  local curr_word=${COMP_WORDS[COMP_CWORD]}

  local commands=""
  local flag_opts="-x --stacktrace -v --verbose -h --help -V --version"
  local arg_opts=""

  if [[ "${curr_word}" == -* ]]; then
    COMPREPLY=( $(compgen -W "${flag_opts} ${arg_opts}" -- "${curr_word}") )
  else
    local positionals=""
    local IFS=$'\n'
    COMPREPLY=( $(compgen -W "${commands// /$'\n'}${IFS}${positionals}" -- "${curr_word}") )
  fi
}

# Define a completion specification (a compspec) for the
# `mn`, `mn.sh`, and `mn.bash` commands.
# Uses the bash `complete` builtin (see [6]) to specify that shell function
# `_complete_mn` is responsible for generating possible completions for the
# current word on the command line.
# The `-o default` option means that if the function generated no matches, the
# default Bash completions and the Readline default filename completions are performed.
complete -F _complete_mn -o default mn mn.sh mn.bash
