# YunoHost Arguments Format

In YunoHost application developpement there are several places where you end up
writting questions for your user like in the `manifest.json/toml`, the
`config_panel.json/toml` or `actions.json/toml`.

This page documents this format and all available kind of questions you can ask
your user. Unless it's stated otherwise, this format applies to everyplace it's
usable (for now: installation arguments in `manifest.json/toml`,
`config_panel.json/toml` and `actions.json/toml`)

## YunoHost arguments general format

The general format for an argument looks like this in toml:

```toml
[maybe.some.stuff.before.the_name]
type = "one_of_the_available_type"
ask.en = "the question in english"
ask.fr = "the question in french"
help.en = "some help text in english" # optional
help.fr = "some help text in french" # optional
example = "an example value" # optional
default = "some stuff" # optional, not available for all types
optional = true # optional, will skip if not answered
```

And in json:

```javascript
{
    "name": "the_name",
    "type": "one_of_the_available_type",  // "sting" is not specified
    "ask": {
        "en": "the question in english",
        "fr": "the question in french"
    },
    "help": {
        "en": "some help text in english",
        "fr": "some help text in french"
    },
    "example": "an example value", // optional
    "default", "some stuff", // optional, not available for all types
    "optional": true // optional, will skip if not answered
},
```

## All avaiable types

### string

This one is the simpliest one and is the default type if you don't specify one.

Example in toml:

```toml
[maybe.some.stuff.before.the_name]
type = "string"  # optional
ask.en = "the question in english"
ask.fr = "the question in french"
example = "an example value"  # optional
default = "some stuff" # optional
```

And in json:

```javascript
{
    "name": "the_name",
    "type": "string",  // optional
    "ask": {
        "en": "the question in english",
        "fr": "the question in french"
    },
    "default": "some stuff", // optional
    "example": "an example value"
},
```

### string with choices

Like string except the user needs to chose in a list of specifics strings.

Example in toml:

```toml
[maybe.some.stuff.before.the_name]
type = "string"
ask.en = "the question in english"
ask.fr = "la question en français"
example = "an example value"  # optional
choices = ["fr", "en"]
default = "en" # optional
```

And in json:

```javascript
{
    "name": "the_name",
    "type": "string",
    "ask": {
        "en": "the question in english",
        "fr": "the question in french"
    },
    "example": "an example value",
    "choices": ["fr", "en"],
    "default": "en" // optional
},
```

### domain

This type will ask the user to chose one of the domains of their YunoHost instance.

Example in toml:

```toml
[maybe.some.stuff.before.the_name]
type = "domain"
ask.en = "the question in english"
ask.fr = "the question in french"
```

And in json:

```javascript
{
    "name": "the_name",
    "type": "domain",
    "ask": {
        "en": "the question in english",
        "fr": "the question in french"
    }
},
```

### Path

This type will ask the user to chose an URL path (generally to happen it to a
domain) like "/path/to/my/app"

Example in toml:

```toml
[maybe.some.stuff.before.the_name]
type = "path"
ask.en = "the question in english"
ask.fr = "the question in french"
default = "/my_app"
```

And in json:

```javascript
{
    "name": "the_name",
    "type": "path",
    "ask": {
        "en": "the question in english",
        "fr": "the question in french"
    },
    "default": "/my_app"
},
```

### User

This type will ask the user to select a user in the list of users in their
YunoHost installation. Generally this is used to select who is going to be the
admin or who is going to have access to this application.

Example in toml:

```toml
[maybe.some.stuff.before.the_name]
type = "user"
ask.en = "the question in english"
ask.fr = "the question in french"
```

And in json:

```javascript
{
    "name": "the_name",
    "type": "user",
    "ask": {
        "en": "the question in english",
        "fr": "the question in french"
    }
},
```

### Password

This type will ask the user to input a password. This is generally used to
input the password for creating an account on the application.

In CLI it will behave like any password query and won't print any character on
type (not "\*\*\*...") for security reasons.

Example in toml:

```toml
[maybe.some.stuff.before.the_name]
type = "password"
ask.en = "the question in english"
ask.fr = "the question in french"
```

And in json:

```javascript
{
    "name": "the_name",
    "type": "password",
    "ask": {
        "en": "the question in english",
        "fr": "the question in french"
    }
},
```

### Boolean

This type will ask the user to answer true or false to a question.

Example in toml:

```toml
[maybe.some.stuff.before.the_name]
type = "boolean"
ask.en = "the question in english"
ask.fr = "the question in french"
default = true
```

And in json:

```javascript
{
    "name": "the_name",
    "type": "boolean",
    "ask": {
        "en": "the question in english",
        "fr": "the question in french"
    },
    "default": true
},
```

### Number

Like string except the user needs to enter a number

Example in toml:

```toml
[maybe.some.stuff.before.the_name]
type = "number"
ask.en = "the question in english"
ask.fr = "the question in french"
default = 0
```

And in json:

```javascript
{
    "name": "the_name",
    "type": "number",
    "ask": {
        "en": "the question in english",
        "fr": "the question in french"
    },
    "default": 0
},
```

### App

This type will ask the user to select an application in the list of installed
application on their YunoHost.

Example in toml:

```toml
[maybe.some.stuff.before.the_name]
type = "app"
ask.en = "the question in english"
ask.fr = "the question in french"
```

And in json:

```javascript
{
    "name": "the_name",
    "type": "app",
    "ask": {
        "en": "the question in english",
        "fr": "the question in french"
    }
},
```

### display_text

This is a special type that allows the application packager to write some text
that will be simply displayed. This is useful to provide more context.

```toml
[maybe.some.stuff.before.the_name]
type = "display_text"
ask.en = "the text in english"
ask.fr = "the text in french"
```

And in json:

```javascript
{
    "name": "the_name",
    "type": "display_text",
    "ask": {
        "en": "the text in english",
        "fr": "the text in french"
    }
},
```
