1#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
2#[serde(rename_all = "snake_case")]
3pub enum OAuth2FormParameter {
4 GrantType,
5 Audience,
6 ClientId,
7 ClientSecret,
8}
9
10#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
11#[serde(rename_all = "snake_case")]
12pub enum OAuth2FormValue {
13 ClientCredentials,
14 WompiApi,
15 #[serde(untagged)]
16 ClientId(String),
17 #[serde(untagged)]
18 ClientSecret(String),
19}
20
21#[derive(serde::Deserialize, Clone)]
22pub struct OAuth2Response {
23 pub access_token: String,
24 pub expires_in: u64,
25 pub token_type: String,
26 pub scope: String,
27 #[serde(skip)]
28 pub expires_at: chrono::DateTime<chrono::Utc>,
29}
30impl OAuth2Response {
31 #[must_use]
32 pub fn calculate_expiry(self) -> Self {
33 let mut res = self;
34 res.expires_at = chrono::Utc::now() + std::time::Duration::from_secs(res.expires_in);
35 res
36 }
37 #[must_use]
38 pub fn is_expired(&self) -> bool {
39 self.expires_at - std::time::Duration::from_secs(120) < chrono::Utc::now()
40 }
41}
42
43#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize)]
44pub struct OAuth2Form<P, V>
45where
46 P: serde::Serialize,
47 V: serde::Serialize,
48{
49 params: [(P, V); 4],
50}
51impl std::ops::Deref for OAuth2Form<OAuth2FormParameter, OAuth2FormValue> {
52 type Target = [(OAuth2FormParameter, OAuth2FormValue); 4];
53 fn deref(&self) -> &Self::Target {
54 &self.params
55 }
56}
57impl OAuth2Form<OAuth2FormParameter, OAuth2FormValue> {
58 #[must_use]
59 pub const fn new(client_id: String, client_secret: String) -> Self {
60 let client_id = OAuth2FormValue::ClientId(client_id);
61 let client_secret = OAuth2FormValue::ClientSecret(client_secret);
62 let params = [
63 (
64 OAuth2FormParameter::GrantType,
65 OAuth2FormValue::ClientCredentials,
66 ),
67 (OAuth2FormParameter::ClientId, client_id),
68 (OAuth2FormParameter::ClientSecret, client_secret),
69 (OAuth2FormParameter::Audience, OAuth2FormValue::WompiApi),
70 ];
71 Self { params }
72 }
73 pub fn new_from_env() -> Result<Self, std::env::VarError> {
74 let client_id = OAuth2FormValue::ClientId(std::env::var("WOMPI_APP_ID")?);
75 let client_secret = OAuth2FormValue::ClientSecret(std::env::var("WOMPI_CLIENT_SECRET")?);
76 let params = [
77 (
78 OAuth2FormParameter::GrantType,
79 OAuth2FormValue::ClientCredentials,
80 ),
81 (OAuth2FormParameter::ClientId, client_id),
82 (OAuth2FormParameter::ClientSecret, client_secret),
83 (OAuth2FormParameter::Audience, OAuth2FormValue::WompiApi),
84 ];
85 Ok(Self { params })
86 }
87}