edgee_api_client/
data_collection.rs

1use connect_builder::{
2    IsUnset, SetBaseurl, SetClientBuilder, SetCookies, SetDefaultHeaders, State,
3};
4
5const PROD_DOMAIN: &str = "edgee.app";
6
7progenitor::generate_api! {
8    spec = "dc-openapi.json",
9    interface = Builder,
10    derives = [ schemars::JsonSchema ],
11}
12
13#[bon::builder(
14    start_fn = new,
15    finish_fn = connect,
16    on(String, into),
17)]
18pub fn connect(
19    baseurl: String,
20    #[builder(default, setters(vis = ""))] client_builder: reqwest::ClientBuilder,
21    #[builder(default, setters(vis = ""))] mut default_headers: reqwest::header::HeaderMap,
22    #[builder(default, setters(vis = ""))] mut cookies: cookie::CookieJar,
23    #[builder(default = false)] debug_mode: bool,
24) -> Client {
25    use reqwest::header;
26
27    if debug_mode {
28        cookies.add(("_edgeedebug", "true"));
29    }
30
31    let cookie_header = {
32        let entries: Vec<_> = cookies
33            .iter()
34            .map(|cookie| cookie.stripped().encoded().to_string())
35            .collect();
36
37        entries.join("; ")
38    };
39    default_headers.insert(header::COOKIE, cookie_header.parse().unwrap());
40
41    let client = client_builder
42        .user_agent(concat!("edgee/", env!("CARGO_PKG_VERSION")))
43        .default_headers(default_headers)
44        .build()
45        .unwrap();
46
47    Client::new_with_client(&baseurl, client)
48}
49
50impl<S: State> ConnectBuilder<S> {
51    pub fn with_client_builder(
52        self,
53        f: impl Fn(reqwest::ClientBuilder) -> reqwest::ClientBuilder,
54    ) -> ConnectBuilder<SetClientBuilder<S>>
55    where
56        S::ClientBuilder: IsUnset,
57    {
58        self.client_builder(f(Default::default()))
59    }
60
61    pub fn with_default_headers(
62        self,
63        f: impl Fn(&mut reqwest::header::HeaderMap),
64    ) -> ConnectBuilder<SetDefaultHeaders<S>>
65    where
66        S::DefaultHeaders: IsUnset,
67    {
68        let mut headers = Default::default();
69        f(&mut headers);
70        self.default_headers(headers)
71    }
72
73    pub fn with_cookies(self, f: impl Fn(&mut cookie::CookieJar)) -> ConnectBuilder<SetCookies<S>>
74    where
75        S::Cookies: IsUnset,
76    {
77        let mut cookies = Default::default();
78        f(&mut cookies);
79        self.cookies(cookies)
80    }
81
82    pub fn project_name(self, name: impl Into<String>) -> ConnectBuilder<SetBaseurl<S>>
83    where
84        S::Baseurl: IsUnset,
85    {
86        let project_name = name.into();
87        self.baseurl(format!("https://{project_name}.{PROD_DOMAIN}"))
88    }
89}
90
91impl types::EdgeeEventDataCollectionEventsItem {
92    pub fn page(
93        builder: types::builder::EdgeeEventPage,
94    ) -> Result<Self, types::error::ConversionError> {
95        Ok(Self::Page(builder.type_("page").try_into()?))
96    }
97
98    pub fn user(
99        builder: types::builder::EdgeeEventUser,
100    ) -> Result<Self, types::error::ConversionError> {
101        Ok(Self::User(builder.type_("user").try_into()?))
102    }
103
104    pub fn track(
105        builder: types::builder::EdgeeEventTrack,
106    ) -> Result<Self, types::error::ConversionError> {
107        Ok(Self::Track(builder.type_("track").try_into()?))
108    }
109}