Here, `string -> record` defines the allowed types of the _pipeline input and output_ of the command:
- It accepts a `string` as pipeline input
- It outputs a `record`
If there are multiple input/output types, they can be placed within brackets and separated with commas or newlines, as in [`str join`](/commands/docs/str_join.md):
```nu
def "str join" [separator?: string]: [
list -> string
string -> string
] { }
```
This indicates that `str join` can accept either a `list<any>` or a `string` as pipeline input. In either case, it will output a `string`.
Some commands don't accept or require data as pipeline input. In this case, the input type will be `<nothing>`. The same is true for the output type if the command returns `null` (e.g., [`rm`](/commands/docs/rm.md) or [`hide`](/commands/docs/hide.md)):
```nu
def xhide [module: string, members?]: nothing -> nothing { }
```
::: tip Note
The example above is renamed `xhide` so that copying it to the REPL will not shadow the built-in `hide` command.
:::
Input-output signatures are shown in the `help` for a command (both built-in and custom) and can also be introspected through:
```nu
help commands | where name == <command_name>
scope commands | where name == <command_name>
```
:::tip Cool!
Input-Output signatures allow Nushell to catch two additional categories of errors at parse-time:
- Attempting to return the wrong type from a command. For example:
```nu
def inc []: int -> int {
$in + 1
print "Did it!"
}
# => Error: nu::parser::output_type_mismatch
# =>
# => × Command output doesn't match int.
# => ╭─[entry #1:1:24]
# => 1 │ ╭─▶ def inc []: int -> int {
# => 2 │ │ $in + 1
# => 3 │ │ print "Did it!"
# => 4 │ ├─▶ }
# => · ╰──── expected int, but command outputs nothing
# => ╰────
```
- And attempting to pass an invalid type into a command:
```nu
def inc []: int -> int { $in + 1 }
"Hi" | inc
# => Error: nu::parser::input_type_mismatch
# =>
# => × Command does not support string input.
# => ╭─[entry #1:1:8]
# => 1 │ "Hi" | inc
# => · ─┬─
# => · ╰── command doesn't support string input
# => ╰────
```
:::
## Documenting Your Command
In order to best help users understand how to use your custom commands, you can also document them with additional descriptions for the commands and parameters.
Run `help vip-greet` to examine our most recent command defined above:
```text
Usage:
> vip-greet <vip> ...(names)
Flags:
-h, --help - Display the help message for this command
Parameters:
vip <string>
...names <string>
Input/output types:
╭───┬───────┬────────╮
│ # │ input │ output │
├───┼───────┼────────┤
│ 0 │ any │ any │
╰───┴───────┴────────╯
```
::: tip Cool!
You can see that Nushell automatically created some basic help for the command simply based on our definition so far. Nushell also automatically adds a `--help`/`-h` flag to the command, so users can also access the help using `vip-greet --help`.
:::
We can extend the help further with some simple comments describing the command and its parameters:
```nu
# Greet guests along with a VIP
#
# Use for birthdays, graduation parties,
# retirements, and any other event which