diff --git a/src/token.rs b/src/token.rs index 7fb04ec..5c9cbd5 100644 --- a/src/token.rs +++ b/src/token.rs @@ -1,4 +1,5 @@ -use chrono::{DateTime, UTC}; +use chrono::{DateTime, UTC, TimeZone}; +use rustc_serialize::{Encodable, Encoder, Decodable, Decoder}; /// OAuth 2.0 access token. /// @@ -29,3 +30,46 @@ impl Token { self.expires.map_or(false, |dt| dt < UTC::now()) } } + +#[derive(RustcEncodable, RustcDecodable)] +struct SerializableToken { + access_token: String, + token_type: String, + expires: Option, + refresh_token: Option, + scope: Option, +} + +impl SerializableToken { + fn from_token(token: &Token) -> Self { + SerializableToken { + access_token: token.access_token.clone(), + token_type: token.token_type.clone(), + expires: token.expires.as_ref().map(DateTime::timestamp), + refresh_token: token.refresh_token.clone(), + scope: token.scope.clone(), + } + } + + fn into_token(self) -> Token { + Token { + access_token: self.access_token, + token_type: self.token_type, + expires: self.expires.map(|t| UTC.timestamp(t, 0)), + refresh_token: self.refresh_token, + scope: self.scope, + } + } +} + +impl Encodable for Token { + fn encode(&self, s: &mut S) -> Result<(), S::Error> { + SerializableToken::from_token(self).encode(s) + } +} + +impl Decodable for Token { + fn decode(d: &mut D) -> Result { + SerializableToken::decode(d).map(SerializableToken::into_token) + } +}