Parcours
/
Gleam
Gleam
/
Exercices
/
Le coffre au trésor sécurisé
Le coffre au trésor sécurisé

Le coffre au trésor sécurisé

Exercice d'apprentissage

Introduction

Types opaques

En Gleam, les types opaques sont des types personnalisés pour lesquels seul le module qui définit le type peut construire des valeurs de ce type ou les utiliser dans un filtrage par motif. C'est utile pour créer des types qui ne doivent être utilisés que d'une manière bien précise.

Les types opaques se définissent à l'aide du mot-clé opaque.

pub opaque type PositiveInt {
  PositiveInt(inner: Int)
}

Ce type PositiveInt est destiné aux situations où l'on veut un entier, mais où celui-ci doit être supérieur ou égal à zéro. Un Int Gleam ordinaire ne conviendrait pas, car il peut aussi être négatif.

Le module qui définit ce type peut définir une fonction pour récupérer la valeur entière interne, et une fonction pour créer le type PositiveInt, qui renverra une erreur si la valeur n'est pas positive.

pub fn from_int(i: Int) -> Result(PositiveInt, String) {
  case i {
    _ if i < 0 -> Error("Value must be positive")
    _ -> Ok(PositiveInt(i))
  }
}

pub fn to_int(i: PositiveInt) -> Int {
  i.inner
}

Avec cette API, les autres modules ne peuvent pas construire un PositiveInt avec une valeur négative, donc toute fonction qui prend un PositiveInt peut être sûre que la valeur est positive.

Instructions

Les apprenants les plus observateurs auront remarqué que le type TreasureChest de l'exercice précédent n'était pas si sécurisé que ça !

Si tu utilisais la fonction get_treasure, tu devais fournir le mot de passe, mais tu pouvais quand même déstructurer le type TreasureChest pour récupérer le trésor sans avoir à connaître le mot de passe.

Corrigeons cela en utilisant un type opaque.

1. Définis le type opaque TreasureChest.

Le TreasureChest contient deux champs :

  • Un mot de passe de type String.
  • Un trésor, qui est d'un type générique.

Le type TreasureChest doit être opaque.

2. Définis la fonction create.

Cette fonction prend deux arguments :

  • Un mot de passe String.
  • Une valeur de trésor de n'importe quel type.

La fonction renvoie un TreasureChest contenant le mot de passe et la valeur.

Si le mot de passe fait moins de 8 caractères, la fonction doit renvoyer une erreur indiquant Password must be at least 8 characters long.

3. Définis la fonction open.

Cette fonction prend deux arguments :

  • Un TreasureChest.
  • Un mot de passe String.

Si le mot de passe correspond à celui du TreasureChest, la fonction doit renvoyer le trésor ; sinon, elle doit renvoyer une erreur indiquant Incorrect password.

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
Gleam Exercism

Prêt à commencer Le coffre au trésor sécurisé ?

Inscris-toi sur Exercism pour apprendre et maîtriser Gleam avec 33 concepts122 exercices, et un vrai mentorat humain, le tout gratuitement.