Rust : serde

De Justine's wiki
Aller à la navigation Aller à la recherche

Serde (en vite fait)

Serde est une librairie Rust que je vois absolument partout. Son objet est la sérialisation et la désérialisation d'objets, que Wikipedia définit comme:

In computing, serialization (or serialisation) is the process of translating a data structure or object state into a format that can be stored (e.g. files in secondary storage devices, data buffers in primary storage devices) or transmitted (e.g. data streams over computer networks) and reconstructed later (possibly in a different computer environment).

En gros, cela nous permet de stocker nos structs dans un tas de formats (yaml, json, toml, et plein d'autre format à 4 lettres) et vice-versa. L'exemple donné sur la page d'accueil est assez parlant, et j'ai rapidement pu l'appliquer pour tester à mon propre code. Je commence par importer les dépendances, attention à activer les bonnes features:

serde = { version = "1.0.152", features = ["derive"] }
serde_json = "1.0.93"
serde_yaml = "0.9.17"

Dans le code de mon shell Sqish, j'ai notamment le struct suivant qui sert à stocker la configuration du shell:

<source lang="rust"> use serde::{Serialize, Deserialize};

  1. [derive(Debug, Serialize, Deserialize)]

pub struct SqishConf {

   pub promptline: String,
   pub promptline_base: String,
   pub aliases: HashMap<String, String>,
   pub hotkeys: HashMap<String, String>,
   pub init: String,

} </source>

On peut voir que je lui ai rajouté les dérivations Serialize et Deserialize en plus de Debug : ces traits viennent de serde.

Une fois que j'ai créé une instance de ce Struct, je peux le sérialiser en autre chose: <src lang="rust"> //Créer une instance... let mut out_conf = SqishConf {

   promptline: out_str.clone(),
   promptline_base: out_str,
   aliases: aliases,
   hotkeys: hotkeys,
   init: startup,

};

//Sérialisation et affichage let conf_json = serde_json::to_string(&out_conf).unwrap(); let conf_yaml = serde_yaml::to_string(&out_conf).unwrap(); dbg!(conf_json); println!("{:?}", conf_yaml); </src>

Et en principe, je pourrais stocker ces variables dans un fichier pour les récupérer par la suite dans un struct SqishConf.