1use chrono::prelude::*;
2use chrono::DateTime;
3
4use crate::event::Event;
5
6use crate::error::Result;
7use reqwest;
8
9pub struct Client {
10 url: String,
11}
12
13impl Default for Client {
14 fn default() -> Self {
15 Client {
16 url: "http://localhost:9200".to_owned(),
17 }
18 }
19}
20
21impl Client {
22 pub fn new(url: &str) -> Client {
23 Client {
24 url: url.to_owned(),
25 }
26 }
27
28 pub fn index<T: codealong::Event + serde::Serialize>(
29 &self,
30 event: T,
31 ) -> Result<reqwest::Response> {
32 let event = Event::new(event);
33 let client = reqwest::Client::new();
34 let index = get_es_index(event.timestamp());
35 let url = format!("{}/{}/_doc/{}", self.url, index, event.id());
36 Ok(client.put(&url).json(&event).send()?)
37 }
38
39 pub fn health(&self) -> Result<reqwest::Response> {
40 let client = reqwest::Client::new();
41 let url = format!("{}/{}", self.url, "_cluster/health");
42 Ok(client.get(&url).send()?)
43 }
44}
45
46fn get_es_index(date: &DateTime<Utc>) -> String {
47 date.format("codealong-%Y.%m").to_string()
48}