#Rust: Premiers pas

Ecriture d’un HelloWorld en Rust, après installation de l’environnement de dév.

Installation

Sur Windows

Télécharger et installer https://win.rustup.rs/ sur
https://www.rust-lang.org/ .

Sur Debian

curl https://sh.rustup.rs -sSf | sh

Environnement de développement (IDE)

  • Installer le plugin Rust pour Visual Code
  • Ajouter quelques composants à l’installation par défaut :
    • rustfmt : Code Formatter
    • clippy : linter
    • rls : autocompletion, type lookup, go-to definition, …

rustup component add rls rustfmt rust-analysis rust-src clippy

Documentation

Commandes de base

Créer un projet

cargo new –bin rusting => minimal skeleton (–lib for librairies)
-> Cargo.toml ~~ package.json
-> IDE recommandé : Visual Code

Démarrer le Hello World

cargo run
cargo test
cargo check : fast compile
cargo doc –open
cargo login + cargo publish = release to https://crates.io (repository dependencies)

Quelques spécificités du langage

String: non mutable
$str : mutable (slice)
$str vers String : « OK ».to_string() (copie le string du binaire vers la mémoire)

println! => le ! = macro
; : pas de ; = return. Ex. fn main() { a+b} ~~ return a+b car pas de « ; »
impl Foo {
fn foo($mut self) != fn foo(self) {
}
}
trait Iterator -> comportement non lié à un objet.
Autres Traits : Read / Write / Send /Sync / Debug / Display / …

let x = 1; constante.
let mut x = 1; variable

for i in 1..=100
(1..=100).filter_map(|i| { … }

struct Foo { is_bar: bool, }
enum Either { Left, Right }
Enums standards : Result (ok ou error) , Option (valeur optionnelle)
Ok(n) ~~ Result::ok(n)

let n = w.write(« hello »)?; Le ? equivaut à un try-catch (retourne un Result.Ok si on a un résultat, throw une exception panic sinon (Result.Err)

Exemple de main.rs

use structopt::StructOpt;
use serde::[Serialize, Deserialize];
use serde_json::[Result, Value];

[derive(StructOpt, Debug, Deserialize)]
struct Cli {
#[structopt(default_value= » »)]
account: String,
}

[derive(Debug, Serialize, Deserialize)]
struct Data [
Name: String,
]
fn main() -> std::result::Result<0,reqwest::Error> {
let _data = Data{Name: « OK ».to_string()];
println!(« [:?] », _data);
let _json_data = serde_json::to_string(&_data); // .unwrap();
println!(« [:?] », _json_data);
let args = Cli::from_args();
printlnICE:?3″, args);
let request_url = format!(« https://haveibeenpwned.com/api/v2/breachedaccount/{account} », account = args.account);
println!(« request_url={:?} », request_url);
let mut _response = reqwest::get(&request_url)?;
if _response.status().is_success() {
let _response_content: Vec = _response.json()?;
println!(« {:?} », _response_content);
} else {
println!(« Error :/ »);
}
0k(())
}

Fichier Cargo.toml correspondant

[package]
name = « rusting »
version = « 0.1.0 »
authors = [« root »]
edition = « 2018 »
[dependencies]
structopt = « * »
serde = {[version= »1.0.92″, features=[« derive »]}
serde_json = « 1.0.39 »
reqwest = « 0.9.17 »

Pour aller plus loin…

https://docs.google.com/presentation/d/1IxmR3xdkUvZ2YVkMBlPH1MWGBBdj-hE5E0JkVUzOfIo/edit?usp=sharing

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *