Skip to content

Commit e689636

Browse files
authored
feat: split client to async and blocking (#396)
1 parent 2dccbf8 commit e689636

File tree

8 files changed

+135
-31
lines changed

8 files changed

+135
-31
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

aw-client-rust/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ serde = "1.0"
1111
serde_json = "1.0"
1212
chrono = { version = "0.4", features = ["serde"] }
1313
aw-models = { path = "../aw-models" }
14+
tokio = { version = "1.28.2", features = ["rt"] }
1415

1516
[dev-dependencies]
1617
aw-datastore = { path = "../aw-datastore" }

aw-client-rust/src/blocking.rs

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
use std::collections::HashMap;
2+
use std::future::Future;
3+
use std::vec::Vec;
4+
5+
use chrono::{DateTime, Utc};
6+
7+
use aw_models::{Bucket, Event};
8+
9+
use super::AwClient as AsyncAwClient;
10+
11+
pub struct AwClient {
12+
client: AsyncAwClient,
13+
pub baseurl: String,
14+
pub name: String,
15+
pub hostname: String,
16+
}
17+
18+
impl std::fmt::Debug for AwClient {
19+
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
20+
write!(f, "AwClient(baseurl={:?})", self.client.baseurl)
21+
}
22+
}
23+
24+
fn block_on<F: Future>(f: F) -> F::Output {
25+
tokio::runtime::Builder::new_current_thread()
26+
.enable_all()
27+
.build()
28+
.expect("build shell runtime")
29+
.block_on(f)
30+
}
31+
32+
macro_rules! proxy_method
33+
{
34+
($name:tt, $ret:ty, $($v:ident: $t:ty),*) => {
35+
pub fn $name(&self, $($v: $t),*) -> Result<$ret, reqwest::Error>
36+
{ block_on(self.client.$name($($v),*)) }
37+
};
38+
}
39+
40+
impl AwClient {
41+
pub fn new(ip: &str, port: &str, name: &str) -> AwClient {
42+
let async_client = AsyncAwClient::new(ip, port, name);
43+
44+
AwClient {
45+
baseurl: async_client.baseurl.clone(),
46+
name: async_client.name.clone(),
47+
hostname: async_client.hostname.clone(),
48+
client: async_client,
49+
}
50+
}
51+
52+
proxy_method!(get_bucket, Bucket, bucketname: &str);
53+
proxy_method!(get_buckets, HashMap<String, Bucket>,);
54+
proxy_method!(create_bucket, (), bucket: &Bucket);
55+
proxy_method!(create_bucket_simple, (), bucketname: &str, buckettype: &str);
56+
proxy_method!(delete_bucket, (), bucketname: &str);
57+
proxy_method!(
58+
get_events,
59+
Vec<Event>,
60+
bucketname: &str,
61+
start: Option<DateTime<Utc>>,
62+
stop: Option<DateTime<Utc>>,
63+
limit: Option<u64>
64+
);
65+
proxy_method!(insert_event, (), bucketname: &str, event: &Event);
66+
proxy_method!(insert_events, (), bucketname: &str, events: Vec<Event>);
67+
proxy_method!(
68+
heartbeat,
69+
(),
70+
bucketname: &str,
71+
event: &Event,
72+
pulsetime: f64
73+
);
74+
proxy_method!(delete_event, (), bucketname: &str, event_id: i64);
75+
proxy_method!(get_event_count, i64, bucketname: &str);
76+
proxy_method!(get_info, aw_models::Info,);
77+
}

aw-client-rust/src/lib.rs

Lines changed: 51 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ extern crate chrono;
33
extern crate gethostname;
44
extern crate reqwest;
55
extern crate serde_json;
6+
extern crate tokio;
7+
8+
pub mod blocking;
69

710
use std::collections::HashMap;
811
use std::vec::Vec;
@@ -13,7 +16,7 @@ use serde_json::Map;
1316
pub use aw_models::{Bucket, BucketMetadata, Event};
1417

1518
pub struct AwClient {
16-
client: reqwest::blocking::Client,
19+
client: reqwest::Client,
1720
pub baseurl: String,
1821
pub name: String,
1922
pub hostname: String,
@@ -28,7 +31,7 @@ impl std::fmt::Debug for AwClient {
2831
impl AwClient {
2932
pub fn new(ip: &str, port: &str, name: &str) -> AwClient {
3033
let baseurl = format!("http://{ip}:{port}");
31-
let client = reqwest::blocking::Client::builder()
34+
let client = reqwest::Client::builder()
3235
.timeout(std::time::Duration::from_secs(120))
3336
.build()
3437
.unwrap();
@@ -41,24 +44,31 @@ impl AwClient {
4144
}
4245
}
4346

44-
pub fn get_bucket(&self, bucketname: &str) -> Result<Bucket, reqwest::Error> {
47+
pub async fn get_bucket(&self, bucketname: &str) -> Result<Bucket, reqwest::Error> {
4548
let url = format!("{}/api/0/buckets/{}", self.baseurl, bucketname);
46-
let bucket = self.client.get(url).send()?.error_for_status()?.json()?;
49+
let bucket = self
50+
.client
51+
.get(url)
52+
.send()
53+
.await?
54+
.error_for_status()?
55+
.json()
56+
.await?;
4757
Ok(bucket)
4858
}
4959

50-
pub fn get_buckets(&self) -> Result<HashMap<String, Bucket>, reqwest::Error> {
60+
pub async fn get_buckets(&self) -> Result<HashMap<String, Bucket>, reqwest::Error> {
5161
let url = format!("{}/api/0/buckets/", self.baseurl);
52-
self.client.get(url).send()?.json()
62+
self.client.get(url).send().await?.json().await
5363
}
5464

55-
pub fn create_bucket(&self, bucket: &Bucket) -> Result<(), reqwest::Error> {
65+
pub async fn create_bucket(&self, bucket: &Bucket) -> Result<(), reqwest::Error> {
5666
let url = format!("{}/api/0/buckets/{}", self.baseurl, bucket.id);
57-
self.client.post(url).json(bucket).send()?;
67+
self.client.post(url).json(bucket).send().await?;
5868
Ok(())
5969
}
6070

61-
pub fn create_bucket_simple(
71+
pub async fn create_bucket_simple(
6272
&self,
6373
bucketname: &str,
6474
buckettype: &str,
@@ -75,16 +85,16 @@ impl AwClient {
7585
created: None,
7686
last_updated: None,
7787
};
78-
self.create_bucket(&bucket)
88+
self.create_bucket(&bucket).await
7989
}
8090

81-
pub fn delete_bucket(&self, bucketname: &str) -> Result<(), reqwest::Error> {
91+
pub async fn delete_bucket(&self, bucketname: &str) -> Result<(), reqwest::Error> {
8292
let url = format!("{}/api/0/buckets/{}", self.baseurl, bucketname);
83-
self.client.delete(url).send()?;
93+
self.client.delete(url).send().await?;
8494
Ok(())
8595
}
8696

87-
pub fn get_events(
97+
pub async fn get_events(
8898
&self,
8999
bucketname: &str,
90100
start: Option<DateTime<Utc>>,
@@ -109,27 +119,31 @@ impl AwClient {
109119
url.query_pairs_mut()
110120
.append_pair("limit", s.to_string().as_str());
111121
};
112-
self.client.get(url).send()?.json()
122+
self.client.get(url).send().await?.json().await
113123
}
114124

115-
pub fn insert_event(&self, bucketname: &str, event: &Event) -> Result<(), reqwest::Error> {
125+
pub async fn insert_event(
126+
&self,
127+
bucketname: &str,
128+
event: &Event,
129+
) -> Result<(), reqwest::Error> {
116130
let url = format!("{}/api/0/buckets/{}/events", self.baseurl, bucketname);
117131
let eventlist = vec![event.clone()];
118-
self.client.post(url).json(&eventlist).send()?;
132+
self.client.post(url).json(&eventlist).send().await?;
119133
Ok(())
120134
}
121135

122-
pub fn insert_events(
136+
pub async fn insert_events(
123137
&self,
124138
bucketname: &str,
125139
events: Vec<Event>,
126140
) -> Result<(), reqwest::Error> {
127141
let url = format!("{}/api/0/buckets/{}/events", self.baseurl, bucketname);
128-
self.client.post(url).json(&events).send()?;
142+
self.client.post(url).json(&events).send().await?;
129143
Ok(())
130144
}
131145

132-
pub fn heartbeat(
146+
pub async fn heartbeat(
133147
&self,
134148
bucketname: &str,
135149
event: &Event,
@@ -139,31 +153,42 @@ impl AwClient {
139153
"{}/api/0/buckets/{}/heartbeat?pulsetime={}",
140154
self.baseurl, bucketname, pulsetime
141155
);
142-
self.client.post(url).json(&event).send()?;
156+
self.client.post(url).json(&event).send().await?;
143157
Ok(())
144158
}
145159

146-
pub fn delete_event(&self, bucketname: &str, event_id: i64) -> Result<(), reqwest::Error> {
160+
pub async fn delete_event(
161+
&self,
162+
bucketname: &str,
163+
event_id: i64,
164+
) -> Result<(), reqwest::Error> {
147165
let url = format!(
148166
"{}/api/0/buckets/{}/events/{}",
149167
self.baseurl, bucketname, event_id
150168
);
151-
self.client.delete(url).send()?;
169+
self.client.delete(url).send().await?;
152170
Ok(())
153171
}
154172

155-
pub fn get_event_count(&self, bucketname: &str) -> Result<i64, reqwest::Error> {
173+
pub async fn get_event_count(&self, bucketname: &str) -> Result<i64, reqwest::Error> {
156174
let url = format!("{}/api/0/buckets/{}/events/count", self.baseurl, bucketname);
157-
let res = self.client.get(url).send()?.error_for_status()?.text()?;
175+
let res = self
176+
.client
177+
.get(url)
178+
.send()
179+
.await?
180+
.error_for_status()?
181+
.text()
182+
.await?;
158183
let count: i64 = match res.trim().parse() {
159184
Ok(count) => count,
160185
Err(err) => panic!("could not parse get_event_count response: {err:?}"),
161186
};
162187
Ok(count)
163188
}
164189

165-
pub fn get_info(&self) -> Result<aw_models::Info, reqwest::Error> {
190+
pub async fn get_info(&self) -> Result<aw_models::Info, reqwest::Error> {
166191
let url = format!("{}/api/0/info", self.baseurl);
167-
self.client.get(url).send()?.json()
192+
self.client.get(url).send().await?.json().await
168193
}
169194
}

aw-client-rust/tests/test.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ extern crate tokio_test;
88

99
#[cfg(test)]
1010
mod test {
11-
use aw_client_rust::AwClient;
11+
use aw_client_rust::blocking::AwClient;
1212
use aw_client_rust::Event;
1313
use chrono::{DateTime, Duration, Utc};
1414
use serde_json::Map;
@@ -51,7 +51,7 @@ mod test {
5151
let shutdown_handler = server.shutdown();
5252

5353
thread::spawn(move || {
54-
let launch = block_on(server.launch()).unwrap();
54+
let _ = block_on(server.launch()).unwrap();
5555
});
5656

5757
shutdown_handler

aw-sync/src/accessmethod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::collections::HashMap;
22

3-
use aw_client_rust::AwClient;
3+
use aw_client_rust::blocking::AwClient;
44
use chrono::{DateTime, Utc};
55
use reqwest::StatusCode;
66

aw-sync/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use std::path::PathBuf;
2020
use chrono::{DateTime, Datelike, TimeZone, Utc};
2121
use clap::{Parser, Subcommand};
2222

23-
use aw_client_rust::AwClient;
23+
use aw_client_rust::blocking::AwClient;
2424

2525
mod accessmethod;
2626
mod sync;

aw-sync/src/sync.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use std::ffi::OsStr;
1313
use std::fs;
1414
use std::path::{Path, PathBuf};
1515

16-
use aw_client_rust::AwClient;
16+
use aw_client_rust::blocking::AwClient;
1717
use chrono::{DateTime, Utc};
1818

1919
use aw_datastore::{Datastore, DatastoreError};

0 commit comments

Comments
 (0)