Aller au contenu principal
Version: 1.0.0

Classer des tickets typés

Construisez une décision métier déterministe : classer un ticket selon son retard et sélectionner la première adresse de contact utilisable. Ce parcours combine enum, optionnel, branches et boucle, sans modèle ni service externe.

1. Écrire le programme​

Créez triage.tb :

triage.tb
module examples.typed_triage

enum Priority
normal
watch
urgent

type Triage
priority is Priority
contact is Optional of Text

function Classify
takes days as Int
gives Priority
do
if days >= 7
give Priority.urgent
else if days >= 3
give Priority.watch
else
give Priority.normal

function FirstContact
takes contacts as List of Optional of Text
gives Optional of Text
do
for contact in contacts
if present contact as address
if address != ""
give some(address)
give none(Text)

strategy Run
takes days as Int
takes contacts as List of Optional of Text
gives Triage
uses Classify
uses FirstContact
do
Classify
with days as days
into priority
FirstContact
with contacts as contacts
into contact
give record Triage { priority as priority, contact as contact }

Les fonctions calculent les valeurs ; la stratégie compose leurs résultats. Aucun manifest ni handler n'est nécessaire.

2. Compiler et exécuter​

touba compile triage.tb --out triage.air.json
touba run triage.air.json \
--entry strategy:examples.typed_triage/Run \
--inputs-json '{"days":8,"contacts":[{"present":false},{"present":true,"value":"a@example.test"}]}' \
--output result

Résultat attendu :

{"priority":"urgent","contact":{"present":true,"value":"a@example.test"}}

3. Vérifier les frontières​

Rejouez avec ces entrées, en conservant la même commande :

EntréesRésultat attendu
{"days":3,"contacts":[]}watch et {"present":false}
{"days":0,"contacts":[{"present":true,"value":""}]}normal et {"present":false}
{"days":8,"contacts":[null]}Refus EntryInputSchemaInvalid

Une absence n'est pas null. Un texte vide est présent, mais la règle métier choisit de l'ignorer. Ces deux contrôles appartiennent à des niveaux différents : le runtime vérifie la forme typée ; la fonction exprime la règle du projet.

4. Construire une notification lisible​

Ce module autonome complète le triage avec un libellé exhaustif et un gabarit. Les minutes sont ici une durée positive fournie par l'application.

notification.tb
module examples.notification

enum Priority
normal
watch
urgent

function Label
takes priority as Priority
gives Text
do
match priority
case Priority.normal
give "Normal"
case Priority.watch
give "Follow up"
case Priority.urgent
give "Urgent"

function Notify
takes priority as Priority
takes elapsed_minutes as Int
gives Text
do
Label
with priority as priority
into label
give f"{label}: {text(elapsed_minutes // 60)} h {text(elapsed_minutes % 60)} min"
touba compile notification.tb --out notification.air.json
touba run notification.air.json \
--entry function:examples.notification/Notify \
--inputs-json '{"priority":"urgent","elapsed_minutes":125}' \
--output result

Résultat : "Urgent: 2 h 5 min". // calcule le quotient entier ; % le reste. text(...) rend explicitement les nombres dans le gabarit. Supprimez un case : le compilateur signale NonExhaustiveMatch. Remplacez text(elapsed_minutes // 60) par le nombre seul : il refuse la conversion implicite. Un gabarit ne peut pas lire un secret par son nom.

Continuer​

Consultez Énumérations, Valeurs optionnelles et Conditions et itérations, puis automatisez ces vérifications.