1use secrecy::{ExposeSecret, SecretString};
4use std::fmt;
5
6#[derive(Clone, Debug)]
8pub struct AuthToken(SecretString);
9
10impl AuthToken {
11 #[must_use]
13 pub const fn new(token: SecretString) -> Self {
14 Self(token)
15 }
16
17 #[must_use]
19 pub fn expose(&self) -> &str {
20 self.0.expose_secret()
21 }
22}
23
24impl From<SecretString> for AuthToken {
25 fn from(value: SecretString) -> Self {
26 Self::new(value)
27 }
28}
29
30impl fmt::Display for AuthToken {
31 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
32 f.write_str("<redacted token>")
33 }
34}
35
36pub trait TokenProvider: Send + Sync {
39 fn personal_access_token(&self) -> SecretString;
41}
42
43#[derive(Clone, Debug)]
45pub struct StaticTokenProvider {
46 token: AuthToken,
47}
48
49impl StaticTokenProvider {
50 #[must_use]
52 pub const fn new(token: AuthToken) -> Self {
53 Self { token }
54 }
55}
56
57impl TokenProvider for StaticTokenProvider {
58 fn personal_access_token(&self) -> SecretString {
59 SecretString::new(self.token.expose().to_owned().into())
60 }
61}
62
63impl From<AuthToken> for StaticTokenProvider {
64 fn from(token: AuthToken) -> Self {
65 Self::new(token)
66 }
67}