1extern crate gethostname;
2extern crate reqwest;
3#[macro_use]
4extern crate aw_models;
5extern crate serde_json;
6
7use std::collections::HashMap;
8use std::vec::Vec;
9
10use serde_json::Map;
11
12pub use aw_models::{Bucket, BucketMetadata, Event};
13
14#[derive(Debug)]
15pub struct AwClient {
16 client: reqwest::blocking::Client,
17 pub baseurl: String,
18 pub name: String,
19 pub hostname: String,
20}
21
22impl AwClient {
23 pub fn new(ip: &str, port: &str, name: &str) -> AwClient {
24 let baseurl = format!("http://{}:{}", ip, port);
25 let client = reqwest::blocking::Client::new();
26 let hostname = gethostname::gethostname().into_string().unwrap();
27 AwClient {
28 client,
29 baseurl,
30 name: name.to_string(),
31 hostname,
32 }
33 }
34
35 pub fn get_bucket(&self, bucketname: &str) -> Result<Bucket, reqwest::Error> {
36 let url = format!("{}/api/0/buckets/{}", self.baseurl, bucketname);
37 let bucket: Bucket = self.client.get(&url).send()?.json()?;
38 Ok(bucket)
39 }
40
41 pub fn get_buckets(&self) -> Result<HashMap<String, Bucket>, reqwest::Error> {
42 let url = format!("{}/api/0/buckets/", self.baseurl);
43 Ok(self.client.get(&url).send()?.json()?)
44 }
45
46 pub fn create_bucket(&self, bucketname: &str, buckettype: &str) -> Result<(), reqwest::Error> {
47 let url = format!("{}/api/0/buckets/{}", self.baseurl, bucketname);
48 let data = Bucket {
49 bid: None,
50 id: bucketname.to_string(),
51 client: self.name.clone(),
52 _type: buckettype.to_string(),
53 hostname: self.hostname.clone(),
54 data: Map::default(),
55 metadata: BucketMetadata::default(),
56 events: None,
57 created: None,
58 last_updated: None,
59 };
60 self.client.post(&url).json(&data).send()?;
61 Ok(())
62 }
63
64 pub fn delete_bucket(&self, bucketname: &str) -> Result<(), reqwest::Error> {
65 let url = format!("{}/api/0/buckets/{}", self.baseurl, bucketname);
66 self.client.delete(&url).send()?;
67 Ok(())
68 }
69
70 pub fn get_events(&self, bucketname: &str) -> Result<Vec<Event>, reqwest::Error> {
71 let url = format!("{}/api/0/buckets/{}/events", self.baseurl, bucketname);
72 Ok(self.client.get(&url).send()?.json()?)
73 }
74
75 pub fn insert_event(&self, bucketname: &str, event: &Event) -> Result<(), reqwest::Error> {
76 let url = format!("{}/api/0/buckets/{}/events", self.baseurl, bucketname);
77 let mut eventlist = Vec::new();
78 eventlist.push(event.clone());
79 self.client.post(&url).json(&eventlist).send()?;
80 Ok(())
81 }
82
83 pub fn heartbeat(
84 &self,
85 bucketname: &str,
86 event: &Event,
87 pulsetime: f64,
88 ) -> Result<(), reqwest::Error> {
89 let url = format!(
90 "{}/api/0/buckets/{}/heartbeat?pulsetime={}",
91 self.baseurl, bucketname, pulsetime
92 );
93 self.client.post(&url).json(&event).send()?;
94 Ok(())
95 }
96
97 pub fn delete_event(&self, bucketname: &str, event_id: i64) -> Result<(), reqwest::Error> {
98 let url = format!(
99 "{}/api/0/buckets/{}/events/{}",
100 self.baseurl, bucketname, event_id
101 );
102 self.client.delete(&url).send()?;
103 Ok(())
104 }
105
106 pub fn get_event_count(&self, bucketname: &str) -> Result<i64, reqwest::Error> {
107 let url = format!("{}/api/0/buckets/{}/events/count", self.baseurl, bucketname);
108 let res = self.client.get(&url).send()?.text()?;
109 let count: i64 = match res.parse() {
110 Ok(count) => count,
111 Err(err) => panic!("could not parse get_event_count response: {:?}", err),
112 };
113 Ok(count)
114 }
115
116 pub fn get_info(&self) -> Result<aw_models::Info, reqwest::Error> {
117 let url = format!("{}/api/0/info", self.baseurl);
118 Ok(self.client.get(&url).send()?.json()?)
119 }
120}