Rust Meetup progress journal

Stiamo implementando queste API di meetup.com.

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:

  1. il vero client HTTP che utilizza le funzioni del crate reqwest
  1. 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)
  • eventi/2018/rustmeetupjournal.txt
  • Ultima modifica: 2018/02/07 12:32
  • da jman