1use crate::{private, Builder, ClientExecutor, RequestBuilder, Result};
21
22use serde::de::DeserializeOwned;
23use tokio::runtime::{self, Runtime};
24
25use std::sync::Arc;
26
27#[derive(Clone, Debug)]
29pub struct Client {
30 inner: crate::Client,
31 runtime: Arc<Runtime>,
32}
33
34impl Client {
35 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 {}