# Discussions autour du developpement de duniter-rs (Duniter en Rust)

**URL:** https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930
**Category:** Dunitrust
**Created:** [14 November 2017 13:47 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930 "2017-11-14T13:47:35Z")
**Posts on this page:** 20
**Page:** 1

<div class="post-metadata">

### Author: ![Inso](https://forum.duniter.org/user_avatar/forum.duniter.org/inso/32/1229_2.png) [@Inso](https://forum.duniter.org/u/Inso)
#### Post date: [14 November 2017 13:47 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/1 "2017-11-14T13:47:35Z")

</div>

Je trouve ça curieux de mettre les tests dans le meme fichier que les sources. C’est une “bonne pratique” Rust ?

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [14 November 2017 14:08 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/2 "2017-11-14T14:08:43Z")

</div>

> [@Encodage des documents](https://forum.duniter.org/t/encodage-des-documents/3596/31):
>
> Je trouve ça curieux de mettre les tests dans le meme fichier que les sources. C’est une “bonne pratique” Rust ?

Oui. Les tests unitaires sont dans un module `tests` dans le module qu’on veut tester, et les tests d’intégration (s’il y en a) sont dans un dossier `tests` à côté de `src`.

Ca fait parti des bonnes pratiques, mais il est possible de [mettre les tests dans un autre fichier](http://xion.io/post/code/rust-unit-test-placement.html) (je viens de le découvrir).

C’est vrai que pour des modules assez long ça me semble une bonne idée, cependant je ne connais aucune `crate` qui sépare ses tests. Je vais faire quelques recherches, je te tiens au courant 🙂

EDIT : Je viens de tester la solution et mes tests ne sont pas trouvés. J’ai du me tromper quelque part, mais il n’empêche que par défaut les tests sont dans le `mod` testé.

---

<div class="post-metadata">

### Author: ![Inso](https://forum.duniter.org/user_avatar/forum.duniter.org/inso/32/1229_2.png) [@Inso](https://forum.duniter.org/u/Inso)
#### Post date: [14 November 2017 14:23 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/3 "2017-11-14T14:23:00Z")

</div>

Ok, ça a une certaine cohérence cette distinction “unit test” / “integration tests” 🙂 Ca me choque pas plus que ça !

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [14 November 2017 14:26 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/4 "2017-11-14T14:26:45Z")

</div>

En plus vu que `tests` est un sous module de `keys`, il peut tester des fonctions/structures non publiques. Ca peut être utile si tu as une fonction interne assez complexe et que tu veux tester son comportement directement, et non ses conséquences dans d’autres fonctions.

De plus, si tu met des blocs de code dans ta documentation, Rust va les considérer comme des tests unitaires supplémentaires. Ca peut être un bon endroit pour mettre des tests simples.

J’avoue que des fois les fichiers sont un peu long, mais dans de grosses crates il y a aussi beaucoup plus de doc, ce qui aère pas mal le fichier et le rend plus lisible. Je pense rajouter un peu de doc d’ailleurs pour préciser les “cas d’erreurs”.

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [17 November 2017 12:13 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/5 "2017-11-17T12:13:24Z")

</div>

En Rust tu as des macros qui permettent de faire du formatage de strings.

```auto
let a = 1;
let b = 2;
let c = a + b;

println!("{} + {} = {}", a, b, c);
let operation = format!("{} + {} = {}", a, b, c);

```

C’est la façon la plus simple de faire. Les accolade peuvent prendre des paramètres en interne pour définir le formatage. Par exemple dans `blocks.rs`, tu as

```auto
    pub fn to_hex(&self) -> String {
        let strings: Vec<String> = self.0.iter().map(|b| format!("{:02X}", b)).collect();

        strings.join("")
    }

```

Cette fonction itère sur chaque élément de mon tableau d’octet, le formate en hexadécimal à 2 caractères majuscules (`{:02X}`), collecte littérateur dans un `Vec` pour ensuite les concaténer.

* * *

Un des formatages est `{:?}` qui permet d’afficher des informations de debugage. Ce ce que permet de définir le trait `Debug`. Le trait `Display` quand à lui gère un affichage normal d’une variable.

Dans `Debug` je rajoute le nom de ma struct, comme ça si 2 types ont un contenu similaire, je pourrais les dissocier. Dans une cadre d’un affichage, je peux simplement afficher la valeur sans avec le nom du type. C’est ce que fait `Display`.

Tu remarquera que `Debug` utilise `Display` en ne passant que `self` dans

```auto
write!(f, "BlockUId ( {} )", self)

```

Après ce cas là est un peu spécial car on appellera jamais directement `fmt`. Cependant dans un autre cas où 2 fonctions de 2 traits différents ont le même nom, il y a une syntaxe pour lever l’ambiguïté.

Il faut noter aussi que pour utiliser une fonction définie dans un trait il faut `use` ce trait. Du coup si seulement 1 des 2 est importé, pas d’ambiguïté, et la bonne fonction est appelée.

* * *

Tu noteras donc qu’on implémente des traits pour adapter ses structures au langage. Il y a par exemple le trait `Add` qui permet d’utiliser l’opérateur +, ou `Deref` qui permet de déréférencer un pointeur intelligent.

---

<div class="post-metadata">

### Author: ![Inso](https://forum.duniter.org/user_avatar/forum.duniter.org/inso/32/1229_2.png) [@Inso](https://forum.duniter.org/u/Inso)
#### Post date: [17 November 2017 12:18 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/6 "2017-11-17T12:18:02Z")

</div>

Par curiosité, quel site tu recommandes pour comprendre les bases de Rust ?

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [17 November 2017 12:20 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/7 "2017-11-17T12:20:32Z")

</div>

Si tu comprends bien l’anglais, fonce direct [ici](https://doc.rust-lang.org/book/). C’est un peu la bible du Rust.

Sinon, il me semble qu’il y a un [tutoriel sur le Rust sur developpez.com](http://guillaume-gomez.developpez.com/tutoriels/apprendre-bases-rust/). Je l’ai à peine survolé donc je ne peux te garantir sa qualité.

---

<div class="post-metadata">

### Author: ![mamygeek](https://forum.duniter.org/user_avatar/forum.duniter.org/mamygeek/32/1003_2.png) [@mamygeek](https://forum.duniter.org/u/mamygeek)
#### Post date: [17 November 2017 12:38 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/8 "2017-11-17T12:38:27Z")

</div>

Le tuto de [développez.com](http://xn--dveloppez-b4a.com), que j’ai commencé paraît bien pour une vue d’ensemble, pour un dev averti et je pense suffisant. Après, je ne suis pas allé au bout et je ne suis pas dev… 😉

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [17 November 2017 12:40 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/9 "2017-11-17T12:40:57Z")

</div>

En aparté, Firefox ont sorti leur nouvelle version de Firefox qui utilise leur nouveau moteur de rendu écris en Rust, et qui profite grandement des architectures multi-cœur. J’avais même entendu parlé de l’utilisation du GPU pour le rendu des pages web.

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [17 November 2017 14:48 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/10 "2017-11-17T14:48:58Z")

</div>

J’ai rajouté les documents `Certification` et `Membership`, et factorisé certains comportements. Ça devrait être plus lisible du coup 🙂 (j’ai aussi rajouté des tests sur les valeurs extraites des documents)

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [17 November 2017 17:24 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/11 "2017-11-17T17:24:54Z")

</div>

> [@Encodage des documents](https://forum.duniter.org/t/encodage-des-documents/3596/60):
>
> Si tu comprends bien l’anglais, fonce direct ici. C’est un peu la bible du Rust.
> 
> Sinon, il me semble qu’il y a un tutoriel sur le Rust sur [developpez.com](http://developpez.com). Je l’ai à peine survolé donc je ne peux te garantir sa qualité.

@nanocryk merci, je n’ai pas commencer le Rust mais il y a deux ateliers d’iniatiation au CdL auquels je vais participer ça va m’apprendre les bases 😉

[https://2017.capitoledulibre.org/programme/#introduction-a-rust](https://2017.capitoledulibre.org/programme/#introduction-a-rust)

[https://2017.capitoledulibre.org/programme/#clippy-un-linter-pour-rust](https://2017.capitoledulibre.org/programme/#clippy-un-linter-pour-rust)

Le 2ème est sur le linter Clippy , tu connais ?

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [17 November 2017 17:39 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/12 "2017-11-17T17:39:52Z")

</div>

> [@Encodage des documents](https://forum.duniter.org/t/encodage-des-documents/3596/64):
>
> Le 2ème est sur le linter Clippy , tu connais ?

Je connais de nom, je vais aller le tester tout de suite 🙂

EDIT : Hey j’ai que 6 warnings x)

---

<div class="post-metadata">

### Author: ![elois](https://forum.duniter.org/user_avatar/forum.duniter.org/elois/32/1541_2.png) [@elois](https://forum.duniter.org/u/elois)
#### Post date: [5 December 2017 00:07 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/13 "2017-12-05T00:07:11Z")

</div>

> [@Encodage des documents](https://forum.duniter.org/t/encodage-des-documents/3596/60):
>
> Si tu comprends bien l’anglais, fonce direct ici. C’est un peu la bible du Rust.
> 
> Sinon, il me semble qu’il y a un tutoriel sur le Rust sur [developpez.com](http://developpez.com). Je l’ai à peine survolé donc je ne peux te garantir sa qualité.

Alors j’ai suivi le tuto de [developpez.com](http://developpez.com) et je suis déçu je le trouve très mal fait, c’est incomplet et dans le désordre bref je déconseille…

En revanche j’ai commencé le rust book, (j’ai lu 4 chapitres sur 21) et il est vraiment très complet et très détaillé j’aime beaucoup, il part quasiment de zéro donc même quelqu’un qui a très peu programmer peu comprendre 🙂 (en tout cas les premiers chapitres)

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [5 December 2017 08:53 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/14 "2017-12-05T08:53:27Z")

</div>

> [@Encodage des documents](https://forum.duniter.org/t/encodage-des-documents/3596/66):
>
> je suis déçu je le trouve très mal fait

Ah ! Je ne l’avais pas lu, je vais jeter un coup d’œil.  
EDIT : Je viens de regarder, en effet il me semble plutôt mauvais.

> [@Encodage des documents](https://forum.duniter.org/t/encodage-des-documents/3596/66):
>
> rust book, (j’ai lu 4 chapitres sur 21) et il est vraiment très complet et très détaillé

Ce n’est pas pour rien qu’on le surnomme la “Bible du Rust” 😉

---

<div class="post-metadata">

### Author: ![cgeek](https://forum.duniter.org/user_avatar/forum.duniter.org/cgeek/32/279_2.png) [@cgeek](https://forum.duniter.org/u/cgeek)
#### Post date: [5 December 2017 11:26 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/15 "2017-12-05T11:26:07Z")

</div>

Je vais m’y mettre aussi, notamment car j’ai remarqué que noter « Rust » dans son C.V. (même à faible niveau) était remarqué par les recruteurs, or j’en ai rencontré une dizaine ces dernières semaines.

Le Rust semble avoir le vent en poupe !

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [5 December 2017 11:57 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/16 "2017-12-05T11:57:21Z")

</div>

Haha. Il est assez réputé au niveau des utilisateurs, mais je ne savais pas que les recruteurs s’y intéressaient. C’est un très bonne chose de voir Rust se développer en entreprise.

Personnellement où je bosse il y a peu de chance qu’il y ai une “migration” vers Rust, même si je compte l’utiliser pour des projets où je serais le seul contributeur/reviewer.

Sinon si tu veux pratiquer ton Rust fraîchement appris, n’hésite pas à venir contribuer à `duniter-rs` xD

---

<div class="post-metadata">

### Author: ![cgeek](https://forum.duniter.org/user_avatar/forum.duniter.org/cgeek/32/279_2.png) [@cgeek](https://forum.duniter.org/u/cgeek)
#### Post date: [5 December 2017 11:59 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/17 "2017-12-05T11:59:26Z")

</div>

C’est précisément cela : un intérêt pour les développements futurs, pas pour migrer du C/C++ existant.

À noter que ce sont surtout les recruteurs les plus techniques qui ont été intéressés.

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [5 December 2017 12:01 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/18 "2017-12-05T12:01:54Z")

</div>

Ce qui est bien avec Rust, c’est qu’il y a un inter-op direct avec du C/C++ grâce à l’absence de _runtime/garbage-collector_.

---

<div class="post-metadata">

### Author: ![nanocryk](https://forum.duniter.org/user_avatar/forum.duniter.org/nanocryk/32/4599_2.png) [@nanocryk](https://forum.duniter.org/u/nanocryk)
#### Post date: [5 December 2017 12:10 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/19 "2017-12-05T12:10:07Z")

</div>

Pour mon implémentation du protocole actuel en Rust, je vais sûrement revoir la structure pour faire quelque chose de puis idiomatique et plus propre. Pour l’instant tous les documents sont gérés avec des `HashMap` : c’est bien pour la partie signature et parsing des documents textes, mais c’est vraiment pas ouf pour les manipuler ensuite. Il faudrait que je fasse des types de base pour les documents, puis que je fasse des types permettant de les transformer en documents signés suivant un certain protocole (actuel comme futur, texte comme binaire (DIP0002)).

@cgeek Ça serait bien d’avoir tes retours sur mon implémentation quand elle sera plus avancée. Sans que tu ai forcement à contribuer, tes connaissances sur l’implémentation de `duniter-ts` pourraient aider à vérifier que `duniter-rs` ne s’éloigne pas trop du fonctionne du premier, surtout que je ne pense pas creuser fichier par fichier dans l’original. Je vais reprendre l’architecture générale et (bien évidement) le protocole, mais je pense refaire le reste à ma façon 😛

---

<div class="post-metadata">

### Author: ![cgeek](https://forum.duniter.org/user_avatar/forum.duniter.org/cgeek/32/279_2.png) [@cgeek](https://forum.duniter.org/u/cgeek)
#### Post date: [5 December 2017 12:26 UTC](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930/20 "2017-12-05T12:26:22Z")

</div>

J’y jetterai certainement un œil, oui.

[Next page](https://forum.duniter.org/t/discussions-autour-du-developpement-de-duniter-rs-duniter-en-rust/3930.md?page=2)
