use std::fmt;
use std::time::{Duration, SystemTime};
use serde::{Deserialize, Serialize};
use crate::client::ClientId;
use crate::scope::ScopeSet;
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DeviceAuthorizationResponse {
pub device_code: String,
pub user_code: String,
pub verification_uri: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub verification_uri_complete: Option<String>,
pub expires_in: u64,
pub interval: u64,
}
impl fmt::Debug for DeviceAuthorizationResponse {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("DeviceAuthorizationResponse")
.field("device_code", &"[redacted]")
.field("user_code", &"[redacted]")
.field("verification_uri", &self.verification_uri)
.field(
"verification_uri_complete",
&self
.verification_uri_complete
.as_ref()
.map(|_| "[redacted]"),
)
.field("expires_in", &self.expires_in)
.field("interval", &self.interval)
.finish()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum DeviceGrantState {
Pending,
Approved {
subject: String,
},
Denied,
}
#[derive(Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DeviceGrant {
pub device_code: String,
pub user_code: String,
pub client_id: ClientId,
pub scope: ScopeSet,
pub state: DeviceGrantState,
pub created_at: SystemTime,
pub expires_at: SystemTime,
pub interval: Duration,
pub last_poll_at: Option<SystemTime>,
}
impl fmt::Debug for DeviceGrant {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("DeviceGrant")
.field("device_code", &"[redacted]")
.field("user_code", &"[redacted]")
.field("client_id", &self.client_id)
.field("scope", &self.scope)
.field("state", &self.state)
.field("created_at", &self.created_at)
.field("expires_at", &self.expires_at)
.field("interval", &self.interval)
.field("last_poll_at", &self.last_poll_at)
.finish()
}
}
pub fn normalize_user_code(entered: &str) -> String {
entered
.chars()
.filter(|c| !c.is_whitespace() && *c != '-')
.map(|c| c.to_ascii_uppercase())
.collect()
}
#[cfg(test)]
#[path = "tests/device.rs"]
mod tests;