#![doc(html_root_url = "https://docs.rs/oauth-credentials/0.3.0")]
#![cfg_attr(feature = "cargo-clippy", allow(renamed_and_removed_lints))]
#![cfg_attr(feature = "cargo-clippy", allow(redundant_field_names))]
#![cfg_attr(feature = "cargo-clippy", allow(redundant_static_lifetimes))]
#![allow(deprecated)]
#![warn(missing_docs, rust_2018_idioms)]
#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(all(not(feature = "std"), feature = "alloc"))]
extern crate alloc;
#[cfg(not(feature = "std"))]
extern crate core as std;
#[cfg(feature = "serde")]
mod serde_imp;
use std::fmt::{self, Debug, Formatter};
#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::string::String;
#[derive(Clone, Copy)]
#[cfg(feature = "alloc")]
pub struct Credentials<T = String> {
pub identifier: T,
pub secret: T,
}
#[derive(Clone, Copy)]
#[cfg(not(feature = "alloc"))]
pub struct Credentials<T> {
pub identifier: T,
pub secret: T,
}
#[derive(Clone, Copy, Debug)]
#[cfg(feature = "alloc")]
pub struct Token<C = String, T = C> {
pub client: Credentials<C>,
pub token: Credentials<T>,
}
#[derive(Clone, Copy, Debug)]
#[cfg(not(feature = "alloc"))]
pub struct Token<C, T = C> {
pub client: Credentials<C>,
pub token: Credentials<T>,
}
impl<T: AsRef<str>> Credentials<T> {
pub fn new(identifier: T, secret: T) -> Self {
Credentials {
identifier: identifier,
secret: secret,
}
}
pub fn identifier(&self) -> &str {
self.identifier.as_ref()
}
pub fn secret(&self) -> &str {
self.secret.as_ref()
}
pub fn as_ref(&self) -> Credentials<&str> {
Credentials::new(self.identifier(), self.secret())
}
}
impl<T> Credentials<T> {
pub fn map<U, F>(self, mut f: F) -> Credentials<U>
where
F: FnMut(T) -> U,
U: AsRef<str>,
{
Credentials::new(f(self.identifier), f(self.secret))
}
}
impl<'a, T: AsRef<str>> From<&'a Credentials<T>> for Credentials<&'a str> {
fn from(credentials: &'a Credentials<T>) -> Self {
credentials.as_ref()
}
}
impl<T: Debug> Debug for Credentials<T> {
fn fmt<'a>(&self, f: &mut Formatter<'a>) -> fmt::Result {
struct Hidden;
impl Debug for Hidden {
fn fmt<'a>(&self, f: &mut Formatter<'a>) -> fmt::Result {
f.write_str("<hidden>")
}
}
#[derive(Debug)]
struct Credentials<T> {
identifier: T,
secret: Hidden,
}
Credentials {
identifier: &self.identifier,
secret: Hidden,
}
.fmt(f)
}
}
impl<C: AsRef<str>, T: AsRef<str>> Token<C, T> {
pub fn new(client: Credentials<C>, token: Credentials<T>) -> Self {
Token {
client: client,
token: token,
}
}
pub fn from_parts(client_identifier: C, client_secret: C, token: T, token_secret: T) -> Self {
let client = Credentials::new(client_identifier, client_secret);
let token = Credentials::new(token, token_secret);
Token::new(client, token)
}
pub fn client(&self) -> Credentials<&str> {
self.client.as_ref()
}
pub fn token(&self) -> Credentials<&str> {
self.token.as_ref()
}
pub fn as_ref(&self) -> Token<&str> {
Token::new(self.client(), self.token())
}
}
impl<C, T> Token<C, T> {
pub fn map_client<C2, F>(self, f: F) -> Token<C2, T>
where
F: FnMut(C) -> C2,
C2: AsRef<str>,
{
Token {
client: self.client.map(f),
token: self.token,
}
}
pub fn map_token<T2, F>(self, f: F) -> Token<C, T2>
where
F: FnMut(T) -> T2,
T2: AsRef<str>,
{
Token {
client: self.client,
token: self.token.map(f),
}
}
}
impl<T> Token<T> {
pub fn map<U, F>(self, mut f: F) -> Token<U>
where
F: FnMut(T) -> U,
U: AsRef<str>,
{
self.map_client(&mut f).map_token(f)
}
}
impl<'a, 'b> Token<&'a str, &'b str> {
pub fn from_ref<C: AsRef<str>, T: AsRef<str>>(
client: &'a Credentials<C>,
token: &'b Credentials<T>,
) -> Self {
Token::new(client.as_ref(), token.as_ref())
}
}
impl<'a, C: AsRef<str>, T: AsRef<str>> From<&'a Token<C, T>> for Token<&'a str> {
fn from(token: &'a Token<C, T>) -> Self {
token.as_ref()
}
}