# Variable
## Synopsis
Une variable est un conteneur qui contiendra une ou plusieurs valeurs.
## Paramètres
| Paramètre | Commentaire |
|-----------|-------------|
| **name**
`string`
`mandatory` | Nom de la variable.
C'est avec ce nom qu'on va pouvoir interagir avec la variable.
Il est préférable de suivre la [convention sur les noms de variable](convention.md). |
| **type**
`string` | Type de la variable.
[Voir la liste des types de variable possibles](type.md).
**Valeur par défaut :** string |
| **description**
`string` | La description de la variable.
Information utilisateur permettant de comprendre l'utilité de la variable. |
| **help**
`string` | Aide complémentaire associée à la variable. |
| **default** | Valeur(s) par défaut de la variable.
Cet valeur est typé, il faut remplir correctement le fichier YAML pour ne pas définir une valeur avec un type incorrect. Par exemple, un "number" doit êre un chiffre, une variable multiple doit être une liste, ...
Pour une variable multiple non [meneuse](../family/leadership.md), la première valeur défini dans la liste sera également la valeur par défaut proposée si on ajoute une nouvelle valeur à cette variable. |
| **auto_save**
`boolean` | Variable à valeur automatiquement modifiée.
Une variable avec valeur automatiquement modifiée est une variable dont la valeur sera considéré comme modifié par l'utilisateur (ce n'est plus une valeur par défaut).
Par exemple, si la valeur de cette variable est issue d'un calcul, la valeur ne sera plus recalculée.
Ces variables sont généralement des variables obligatoires. En effet ces variable ne sont automatiquement modifiées que si elles ont une valeurs.
Une [variable meneuse ou suiveuse](../family/leadership.md) ne peut pas avoir la propriété `auto_save`. |
| **mode**
`string` | [Mode](../variable/mode.md) de la variable
Le mode par défaut d'une variable est le mode de la famille parente.
Cas particulier :
-une variable à valeur automatiquement modifiée ou une variable en lecture seule automatique est par défaut en mode "basic"
- si la variable n'est pas dans une famille, la variable aura le mode "normal" par défaut.
- une variable obligatoire sans valeur par défaut (calculer ou non) aura le mode "basic". |
| **muli**
`boolean` | La variable a pour valeur une liste. Par défaut la variable n'accepte pas de liste. |
| **unique**
`boolean` | La variable multiple accepte plusieurs fois la même valeur. Par défaut une variable multiple n'accepte qu'une seule fois la même valeur dans la liste. |
| **hidden**
`boolean` ou [`calculation`](../condition/README.md) | Variable invisible.
Permet de cacher une variable.
Cela signifie que la variable ne sera plus visible pour l'utilisateur mais sera visible pour un calcul.
Lorsqu'on rend invisible une variable l'utilisateur ne pourra pas modifier sa valeur, il s'il a déjà réussi à la modifier, cette valeur ne sera pas prise en compte. |
| **disabled**
`boolean` ou [`calculation`](../condition/README.md) | Variable désactivée.
Permet de désactiver une variable.
Cela signifie que la variable ne sera plus visible pour l'utilisateur mais également pour un calcul. |
| **mandatory**
`boolean` ou [`calculation`](../condition/README.md) | Variable obligatoire.
Variable dont une valeur est requise.
Pour une variable multiple, cela signifie que la liste ne doit pas être vide.
📝 Une variable avec une valeur par défaut non calculée ou de type "boolean" sont automatiquement considéré comme obligatoire défaut, si ce n'est pas le comportement voulu, il mettre le préciser comme cela : "mandatory: false". |
| **redefine**
`boolean` | Il est possible de définir une variable dans un dictionnaire et de changer son comportement dans une second dictionnaire. |
| **exists**
`boolean` | Il est parfois utile de créer une variable si elle n'existe pas dans un autre dictionnaire.
Si cette variable existe dans un autre dictionnaire, elle ne sera pas modifié ni recréé. |
| **test**
`list` | L'attribut "test" est un attribut spécial qui permet aux concepteurs d'un dictionnaire d'influancer un robot de test en précisant de valeurs utiles à tester.
Concrêtement, le contenu de cet attribut est enregister dans une "information" de l'option Tiramisu correspondante. Cette attribut attend une liste de valeurs |
Exemple :
```yml
---
version: '1.0'
my_variable:
test: 'yes'
```
Il est possible de préciser plusieurs valeurs avec le séparateur "|" :
```yml
---
version: '1.0'
my_variable:
test: 'yes|no'
```
Cette valeur peut être utilisé à tout moment comme valeur [d'un paramètre](../param/information.md).
## Exemples
### Quelques variables de base
```yml
---
version: '1.0'
my_variable:
type: string
description: This is a good variable
help: This is the help of a good variable
default: value
version: '1.0'
my_variable_multi_1:
multi: true
default:
- value
my_variable_multi_2:
multi: true
default:
- value1
- value2
version: '1.0'
my_variable_multi_not_unique:
multi: true
unique: false
default:
- value1
- value2
- value2
```
### Redéfinition d'une variable
Créons notre variable :
```yml
---
version: '1.0'
my_variable:
type: string
```
Et redéfinisons là :
```yml
---
version: '1.0'
my_variable:
redefine: true
description: New description
```
### Créer une variable inexistante
```yml
---
version: '1.0'
my_variable:
exists: false
```
## Redéfinir une variable si elle existe
Parfois on veut pouvoir redéfinir une variable mais seulement dans le cas où elle existe déjà :
```yml
---
version: '1.0'
my_variable:
exists: true
hidden: true
```
Dans ce cas la variable ne sera pas créé mais uniquement cachée si elle existe déjà.