goauth 0.2.14

Crate for authenticating Server to Server Apps for Google Cloud Engine.
Documentation
use serde_json;
use time;

use std::*;
use std::error::Error;

use error::GOErr;
use scopes::Scope;

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct JwtClaims {
  iss: String,
  scope: String,
  aud: String,
  exp: i64,
  iat: i64
}

impl JwtClaims {
  pub fn new(service_acc_id: String,
         scope: Scope,
         aud_url: String,
         valid_from: Option<i64>,
         expires_after: Option<i64>) -> Self {
    let iat = match valid_from {
      Some(x) => x,
      None => time::now_utc().to_timespec().sec
    };
    let exp = match expires_after {
      Some(x) => iat + x,
      None => iat + 3600
    };
    JwtClaims {
      iss: service_acc_id,
      scope: scope.url(),
      aud : aud_url,
      exp : exp,
      iat : iat
    }
  }
}

impl fmt::Display for JwtClaims {
  fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    write!(f, "{}", &serde_json::to_string_pretty(&self).unwrap())
  }
}

#[derive(Serialize, Deserialize, Debug)]
pub struct TokenErr {
  error: String,
  error_description: String
}

impl fmt::Display for TokenErr {
  fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    write!(f, "TokenErr: {}", self.error_description)
  }
}

impl Error for TokenErr {
  fn description(&self) -> &str {
    &self.error_description
  }

  fn cause(&self) -> Option<&Error> {
    None
  }
}

#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Token {
  access_token: String,
  token_type: String,
  expires_in: u32
}

impl fmt::Display for Token {
  fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
    write!(f, "Token: (type: {}, expires_in: {})", self.token_type, self.expires_in)
  }
}

impl Token {
  pub fn access_token(&self) -> &str {
      &self.access_token
  }

    pub fn token_type(&self) -> &str {
      &self.token_type
    }

  pub fn from_str(response: &str) -> Result<Token, GOErr> {
    match serde_json::from_str(response) {
      Ok(x) => Ok(x),
      Err(e) => {
        match serde_json::from_str(response) {
          Ok(x) => Err(GOErr::TokenErr(x)),
          _ => panic!("{}", e)
        }
      }
    }
  }
}