Packages
fnord
0.6.5
0.9.40
0.9.39
0.9.38
0.9.37
0.9.36
0.9.35
0.9.34
0.9.33
0.9.32
0.9.31
0.9.30
0.9.29
0.9.28
0.9.27
0.9.26
0.9.25
0.9.24
0.9.23
0.9.22
0.9.21
0.9.20
0.9.19
0.9.18
0.9.17
0.9.16
0.9.15
0.9.14
0.9.13
0.9.12
0.9.11
0.9.10
0.9.9
0.9.8
0.9.7
0.9.6
0.9.5
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.99
0.8.98
0.8.97
0.8.96
0.8.95
0.8.94
0.8.93
0.8.92
0.8.91
0.8.90
0.8.89
0.8.88
0.8.87
0.8.86
0.8.85
0.8.84
0.8.83
0.8.82
0.8.81
0.8.80
0.8.79
0.8.78
0.8.77
0.8.76
0.8.75
0.8.74
0.8.73
0.8.72
0.8.71
0.8.70
0.8.69
0.8.68
0.8.67
0.8.66
0.8.65
0.8.64
0.8.63
0.8.62
0.8.61
0.8.60
0.8.59
0.8.58
0.8.57
0.8.56
0.8.55
0.8.54
0.8.53
0.8.52
0.8.51
0.8.50
0.8.49
0.8.48
0.8.47
0.8.46
0.8.45
0.8.44
0.8.43
0.8.42
0.8.41
0.8.40
0.8.39
0.8.38
0.8.37
0.8.36
0.8.35
0.8.34
0.8.33
0.8.32
0.8.31
0.8.30
0.8.29
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.1
0.8.0
0.7.24
0.7.23
0.7.22
0.7.21
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
0.7.7
0.7.6
0.7.5
0.7.3
0.7.2
0.7.1
0.7.0
0.6.9
0.6.8
0.6.7
0.6.6
0.6.5
0.6.4
0.6.3
0.6.1
0.6.0
0.5.9
0.5.8
0.5.7
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.44
0.4.43
0.4.42
0.4.41
0.4.40
0.4.39
0.4.38
0.4.37
0.4.36
0.4.35
0.4.34
0.4.33
0.4.32
0.4.30
0.4.29
0.4.28
0.4.27
0.4.26
0.4.25
0.4.24
0.4.23
0.4.22
0.4.21
0.4.20
0.4.19
0.4.18
0.4.17
0.4.16
0.4.15
0.4.14
0.4.13
0.4.12
0.4.11
0.4.10
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.3.0
0.2.0
0.1.0
AI code archaeology
Current section
Files
Jump to
Current section
Files
lib/shell/completion.ex
defmodule Shell.Completion do
@moduledoc """
Public API for generating shell completion scripts.
This module defines the DSL types and provides a single function to
generate a completion script for a given shell type.
## Example
Shell.Completion.generate(spec, shell: :bash)
"""
@typedoc """
A source for completions: static choices, command output, files, directories,
or a custom function (not supported).
"""
@type completion_source ::
{:choices, [String.t()]}
| {:command, String.t()}
| :files
| :directories
| (String.t() -> [String.t()])
@typedoc "Specification for an argument."
@type argument_spec :: %{
required(:name) => String.t(),
required(:from) => completion_source
}
@typedoc "Specification for an option."
@type option_spec :: %{
required(:name) => String.t(),
optional(:from) => completion_source,
optional(:takes_argument) => boolean()
}
@typedoc "Specification for a subcommand."
@type subcommand_spec :: %{
required(:name) => String.t(),
optional(:description) => String.t(),
optional(:arguments) => [argument_spec()],
optional(:options) => [option_spec()],
optional(:subcommands) => [subcommand_spec()]
}
@typedoc "Specification for a top-level command."
@type command_spec :: %{
required(:name) => String.t(),
optional(:description) => String.t(),
optional(:subcommands) => [subcommand_spec()],
optional(:arguments) => [argument_spec()],
optional(:options) => [option_spec()]
}
@doc """
Generates a shell completion script for the given spec.
## Options
* `:shell` - The type of shell to generate completions for (currently only `:bash` and `:zsh` are supported).
## Example
Shell.Completion.generate(spec, shell: :bash)
"""
@spec generate(command_spec(), keyword()) :: String.t()
def generate(spec, shell: shell_type) do
case shell_type do
:bash -> Shell.Completion.Bash.generate_bash_script(spec)
:zsh -> Shell.Completion.Zsh.generate_zsh_script(spec)
other -> raise ArgumentError, "Unsupported shell type: #{inspect(other)}"
end
end
end