====== Rust Meetup progress journal ======
Stiamo implementando [[https://www.meetup.com/meetup_api/docs|queste API di meetup.com]].
===== Topics del Meetup 03/02 =====
==== 1. Utilizzo dell'operatore '?' ====
Questo operatore cattura un'eccezione e causa un ''return'' anticipato della funzione al chiamante. Sostituisce la macro ''try!(...)'', [[https://doc.rust-lang.org/std/macro.try.html|ora deprecata]].
A helper macro for reducing boilerplate code for matching Result together with converting downstream errors.
==== 2. Catch-and-rethrow my own exception ====
Per fare questa cosa c'e' del boilerplate da scrivere. Il metodo meno barocco che abbiamo trovato e' scrivere una enum con un elenco di eccezioni che vogliamo catturare:
#[derive(Debug)]
pub enum MyError {
FirstError(std::io::IoError),
SecondError(std::io::IoError),
....
}
La presenza del ''#[derive(Debug)]'' serve perche' altrimenti se ci sono degli ''unwrap()'' in giro, non vedono implementato il metodo ''Display()'' che serve per stampare a diritto gli oggetti, ex.:
let my_obscure_obj = MyObscureClass::new();
print!(":?", my_obscure_obj);
Il codice poi cattura l'eccezione e la rimappa sulla nostra, facendo risalire al chiamante un ''FirstError'' al cui interno abbiamo l'eccezione originale:
let res = do_something().map_err(MyError::FirstError)?
By the way, questo approccio, sembra lo stesso del crate [[https://crates.io/crates/quick-error|quick-error]], il cui uso forse aggiunge un valore marginale alla nostra soluzione.
==== 3. Refactor del client meetup ====
Abbiamo splittato la parte library (che ha un [[https://github.com/apiraino/rust-meetup-client-lib|suo nuovo repo)]] dall'applicazione principale (il client che implementa la libreria).
==== 4. Integration tests ====
Abbiamo provato come implementare dei mock per fare degli integration test. Abbiamo scritto un modulo con una classe astratta (''Trait'' in rust-lingo) che poi viene implementata (''impl'') in due modi diversi:
- il vero client HTTP che utilizza le funzioni del crate ''reqwest''
- un metodo dummy che ritorna una fixture finta in JSON (TODO)
Ecco la nuova struttura del progetto:
src/
├── http_client
│ ├── http_client_default.rs (client http)
│ ├── http_client.rs (client mock)
│ └── mod.rs (file che rende questa dir importabile come modulo)
├── lib.rs (entrypoint della libreria)
└── meetup_client.rs (API che si interfaccia verso Meetup)