plausible_rs/api/event/
mod.rs

1mod event_headers;
2mod event_payload;
3mod event_payload_builder;
4mod prop_value;
5
6use crate::{Error, Plausible};
7use bytes::Bytes;
8pub use event_headers::*;
9pub use event_payload::*;
10pub use event_payload_builder::*;
11pub use prop_value::*;
12use reqwest::{RequestBuilder, StatusCode};
13
14pub const PAGEVIEW_EVENT: &str = "pageview";
15
16impl Plausible {
17    /// Records a pageview or custom event.
18    ///
19    /// When using this endpoint, it's crucial to send the HTTP headers correctly,
20    /// since these are used for unique user counting.
21    ///
22    /// # Errors
23    ///
24    /// Will return `Err` if an error occurred while creating/sending the request,
25    /// if it failed to decode the response's bytes, or if the response's status code was not a
26    /// success.
27    pub async fn event(
28        &self,
29        headers: EventHeaders,
30        payload: EventPayload,
31    ) -> Result<Bytes, Error> {
32        // create request
33        let request: RequestBuilder = self
34            .client
35            .post(format!("{}/api/event", self.base_url))
36            .header("Content-Type", "application/json")
37            .header("User-Agent", headers.user_agent)
38            .header("X-Forwarded-For", headers.x_forwarded_for);
39
40        // send request, get response
41        let response = request.json(&payload).send().await?;
42
43        // parse status code and returned bytes
44        let status_code: StatusCode = response.status();
45        let bytes = response.bytes().await?;
46
47        // check if failure
48        if !status_code.is_success() {
49            return Err(Error::RequestFailed { bytes, status_code });
50        }
51
52        // success
53        Ok(bytes)
54    }
55}