Stiamo implementando queste API di meetup.com.
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.
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.
Abbiamo splittato la parte library (che ha un suo nuovo repo) dall'applicazione principale (il client che implementa la libreria).
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:
reqwest
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)