aw_client_rust/
lib.rs

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}