gw2api_rs/
blocking.rs

1//! Drop in place sync api client.
2//!
3//! Requires the `blocking` feature to be enabled.
4//!
5//! # Usage
6//!
7//! ```no_run
8//! use gw2api_rs::v2::build::Build;
9//! use gw2api_rs::blocking::Client;
10//!
11//! fn main() -> Result<(), Box<dyn std::error::Error>> {
12//!     let client = Client::new();
13//!     let build = Build::get(&client)?;
14//!
15//!     println!("{}", build.id);
16//!     Ok(())
17//! }
18//! ```
19
20use crate::{private, Builder, ClientExecutor, RequestBuilder, Result};
21
22use serde::de::DeserializeOwned;
23use tokio::runtime::{self, Runtime};
24
25use std::sync::Arc;
26
27/// The synchronous api client.
28#[derive(Clone, Debug)]
29pub struct Client {
30    inner: crate::Client,
31    runtime: Arc<Runtime>,
32}
33
34impl Client {
35    /// Creates a new `Client`.
36    pub fn new() -> Self {
37        Self::new_with_inner(crate::Client::new())
38    }
39
40    #[inline]
41    pub fn builder() -> Builder {
42        Builder::new()
43    }
44
45    fn new_with_inner(inner: crate::Client) -> Self {
46        let runtime = runtime::Builder::new_current_thread()
47            .enable_io()
48            .enable_time()
49            .build()
50            .unwrap();
51
52        Self {
53            inner,
54            runtime: Arc::new(runtime),
55        }
56    }
57}
58
59impl Default for Client {
60    #[inline]
61    fn default() -> Self {
62        Self::new()
63    }
64}
65
66impl From<Builder> for Client {
67    fn from(builder: Builder) -> Self {
68        let inner = builder.into();
69
70        Self::new_with_inner(inner)
71    }
72}
73
74impl<T> ClientExecutor<T> for Client
75where
76    T: DeserializeOwned,
77{
78    type Result = Result<T>;
79
80    fn send(&self, builder: RequestBuilder) -> Self::Result {
81        self.runtime.block_on(self.inner.send(builder))
82    }
83}
84
85#[doc(hidden)]
86impl private::Sealed for Client {}