1use crate::Client;
4use crate::Message;
5use crate::Result;
6use std::time::Duration;
7
8#[derive(Clone, Debug)]
14pub struct HttpClient {
15 client: reqwest::Client,
16 host: String,
17}
18
19impl Default for HttpClient {
20 fn default() -> Self {
21 HttpClient {
22 client: reqwest::Client::builder()
23 .connect_timeout(Duration::new(10, 0))
24 .build()
25 .unwrap(),
26 host: "https://api.segment.io".to_owned(),
27 }
28 }
29}
30
31impl HttpClient {
32 pub fn new(client: reqwest::Client, host: String) -> HttpClient {
39 HttpClient { client, host }
40 }
41}
42
43#[async_trait::async_trait]
44impl Client for HttpClient {
45 async fn send(&self, write_key: String, msg: Message) -> Result<()> {
46 let path = match msg {
47 Message::Identify(_) => "/v1/identify",
48 Message::Track(_) => "/v1/track",
49 Message::Page(_) => "/v1/page",
50 Message::Screen(_) => "/v1/screen",
51 Message::Group(_) => "/v1/group",
52 Message::Alias(_) => "/v1/alias",
53 Message::Batch(_) => "/v1/batch",
54 };
55
56 let _ = self
57 .client
58 .post(format!("{}{}", self.host, path))
59 .basic_auth(write_key, Some(""))
60 .json(&msg)
61 .send()
62 .await?
63 .error_for_status()?;
64
65 Ok(())
66 }
67}