1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//! Async API calls for lta-rs. Currently uses async/await
//!

pub mod bus;
pub mod crowd;
pub mod lta_client;
pub mod taxi;
pub mod traffic;
pub mod train;

use crate::lta_client::LTAClient;
use lta_utils_commons::{reqwest, serde, Client, LTAError};
use reqwest::RequestBuilder;

pub(crate) async fn build_req_async<T, M>(client: &LTAClient, url: &str) -> Result<M, LTAError>
where
    for<'de> T: serde::Deserialize<'de> + Into<M>,
{
    let rb = client.get_req_builder(url);
    rb.send().await?.json::<T>().await.map(|f| f.into())
}

pub(crate) async fn build_req_async_with_query<T, M, F>(
    client: &LTAClient,
    url: &str,
    query: F,
) -> Result<M, LTAError>
where
    F: FnOnce(RequestBuilder) -> RequestBuilder,
    for<'de> T: serde::Deserialize<'de> + Into<M>,
{
    let rb = client.get_req_builder(url);
    query(rb)
        .send()
        .await?
        .json::<T>()
        .await
        .map(|f: T| f.into())
}