====== 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)