diff --git a/src/service_account.rs b/src/service_account.rs index eeb78e0..71590c1 100644 --- a/src/service_account.rs +++ b/src/service_account.rs @@ -16,7 +16,7 @@ use std::error; use std::sync::{Arc, Mutex}; use crate::storage::{hash_scopes, MemoryStorage, TokenStorage}; -use crate::types::{ApplicationSecret, GetToken, StringError, Token}; +use crate::types::{ApplicationSecret, GetToken, JsonError, StringError, Token}; use futures::stream::Stream; use futures::{future, prelude::*}; @@ -283,7 +283,15 @@ impl<'a, C: 'static + hyper::client::connect::Connect> ServiceAccountAccess { }) .map(|c| String::from_utf8(c.into_bytes().to_vec()).unwrap()) .and_then(|s| { - serde_json::from_str(&s).map_err(|e| Box::new(e) as Box) + if let Ok(jse) = serde_json::from_str::(&s) { + Err( + Box::new(StringError::new(jse.error, jse.error_description.as_ref())) + as Box, + ) + } else { + serde_json::from_str(&s) + .map_err(|e| Box::new(e) as Box) + } }) .then( |token: Result>| match token { diff --git a/src/types.rs b/src/types.rs index 54606ad..0feb929 100644 --- a/src/types.rs +++ b/src/types.rs @@ -11,7 +11,7 @@ pub trait Flow { fn type_id() -> FlowType; } -#[derive(Deserialize)] +#[derive(Deserialize, Debug)] pub struct JsonError { pub error: String, pub error_description: Option,