wompi-models 0.1.0

Models for the Wompi API
Documentation
#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum OAuth2FormParameter {
    GrantType,
    Audience,
    ClientId,
    ClientSecret,
}

#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum OAuth2FormValue {
    ClientCredentials,
    WompiApi,
    #[serde(untagged)]
    ClientId(String),
    #[serde(untagged)]
    ClientSecret(String),
}

#[derive(serde::Deserialize, Clone)]
pub struct OAuth2Response {
    pub access_token: String,
    pub expires_in: u64,
    pub token_type: String,
    pub scope: String,
    #[serde(skip)]
    pub expires_at: chrono::DateTime<chrono::Utc>,
}
impl OAuth2Response {
    #[must_use]
    pub fn calculate_expiry(self) -> Self {
        let mut res = self;
        res.expires_at = chrono::Utc::now() + std::time::Duration::from_secs(res.expires_in);
        res
    }
    #[must_use]
    pub fn is_expired(&self) -> bool {
        self.expires_at - std::time::Duration::from_secs(120) < chrono::Utc::now()
    }
}

#[derive(Debug, Clone, PartialEq, Eq, Hash, serde::Serialize)]
pub struct OAuth2Form<P, V>
where
    P: serde::Serialize,
    V: serde::Serialize,
{
    params: [(P, V); 4],
}
impl std::ops::Deref for OAuth2Form<OAuth2FormParameter, OAuth2FormValue> {
    type Target = [(OAuth2FormParameter, OAuth2FormValue); 4];
    fn deref(&self) -> &Self::Target {
        &self.params
    }
}
impl OAuth2Form<OAuth2FormParameter, OAuth2FormValue> {
    #[must_use]
    pub const fn new(client_id: String, client_secret: String) -> Self {
        let client_id = OAuth2FormValue::ClientId(client_id);
        let client_secret = OAuth2FormValue::ClientSecret(client_secret);
        let params = [
            (
                OAuth2FormParameter::GrantType,
                OAuth2FormValue::ClientCredentials,
            ),
            (OAuth2FormParameter::ClientId, client_id),
            (OAuth2FormParameter::ClientSecret, client_secret),
            (OAuth2FormParameter::Audience, OAuth2FormValue::WompiApi),
        ];
        Self { params }
    }
    pub fn new_from_env() -> Result<Self, std::env::VarError> {
        let client_id = OAuth2FormValue::ClientId(std::env::var("WOMPI_APP_ID")?);
        let client_secret = OAuth2FormValue::ClientSecret(std::env::var("WOMPI_CLIENT_SECRET")?);
        let params = [
            (
                OAuth2FormParameter::GrantType,
                OAuth2FormValue::ClientCredentials,
            ),
            (OAuth2FormParameter::ClientId, client_id),
            (OAuth2FormParameter::ClientSecret, client_secret),
            (OAuth2FormParameter::Audience, OAuth2FormValue::WompiApi),
        ];
        Ok(Self { params })
    }
}