use std::borrow::Cow;
use http::Uri;
use serde::{Deserialize, Serialize};
pub mod github;
#[derive(Serialize, Deserialize, Debug)]
pub struct DeviceAuthorizationRequest<'s> {
pub client_id: Cow<'s, str>,
pub scope: Cow<'s, str>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DeviceAuthorizationResponse {
pub device_code: String,
pub user_code: String,
#[serde(with = "http_serde_ext::uri")]
pub verification_uri: Uri,
#[allow(unused)]
#[serde(with = "http_serde_ext::uri::option", skip_deserializing)]
pub verification_uri_complete: Option<Uri>,
#[allow(unused)]
pub expires_in: i64,
pub interval: Option<i64>,
}
#[derive(Serialize, Deserialize)]
pub struct DeviceAccessTokenRequest<'s> {
grant_type: Cow<'static, str>,
pub device_code: Cow<'s, str>,
pub client_id: Cow<'s, str>,
}
impl<'s> DeviceAccessTokenRequest<'s> {
const GRANT_TYPE: &'static str = "urn:ietf:params:oauth:grant-type:device_code";
#[must_use]
pub fn new(device_code: &'s str, client_id: &'s str) -> Self {
Self {
grant_type: Self::GRANT_TYPE.into(),
device_code: device_code.into(),
client_id: client_id.into(),
}
}
}
#[derive(Serialize, Deserialize, Debug)]
pub struct DeviceAccessTokenResponse {
pub access_token: String,
pub token_type: String,
pub expires_in: Option<i64>,
}
#[derive(Deserialize, Debug)]
pub struct DeviceAccessTokenErrorResponse {
pub error: DeviceAccessTokenErrorCode,
#[allow(unused)]
pub error_description: Option<String>,
#[allow(unused)]
#[serde(with = "http_serde_ext::uri::option", skip_deserializing)]
pub error_uri: Option<Uri>,
}
#[derive(PartialEq, Eq, Debug, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DeviceAccessTokenErrorCode {
AuthorizationPending,
SlowDown,
AccessDenied,
ExpiredToken,
InvalidRequest,
InvalidClient,
InvalidGrant,
UnauthorizedClient,
UnsupportedGrantType,
InvalidScope,
IncorrectDeviceCode,
}
impl DeviceAccessTokenErrorCode {
pub fn should_continue_to_poll(&self) -> bool {
use DeviceAccessTokenErrorCode::{AuthorizationPending, SlowDown};
*self == AuthorizationPending || *self == SlowDown
}
}