use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use super::challenges::Challenge;
use super::identifier::Identifier;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Authorization {
pub identifier: Identifier,
pub status: AuthorizationStatus,
#[serde(default)]
pub expires: Option<DateTime<Utc>>,
pub challenges: Vec<Challenge>,
#[serde(skip_serializing, default)]
pub wildcard: bool,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum AuthorizationStatus {
Pending,
Valid,
Invalid,
Deactivated,
Expired,
Revoked,
}
impl AuthorizationStatus {
pub fn is_finished(&self) -> bool {
matches!(
self,
AuthorizationStatus::Valid
| AuthorizationStatus::Invalid
| AuthorizationStatus::Deactivated
| AuthorizationStatus::Expired
| AuthorizationStatus::Revoked
)
}
pub fn is_valid(&self) -> bool {
matches!(self, AuthorizationStatus::Valid)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn authorization() {
let raw = crate::example!("authorization.json");
let auth: Authorization = serde_json::from_str(raw).unwrap();
assert_eq!(
auth.identifier,
Identifier::Dns {
value: "www.example.org".into()
}
);
}
}