Rust Meetup progress journal
Stiamo implementando 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!(…)
, 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 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 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)