edgee_api_client/
data_collection.rs1use 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}