/// <summary>
        /// Reads an <see cref="HttpResponseMessage"/> to parse a <see cref="SpotifyApiError"/>.
        /// </summary>
        /// <param name="response">The <see cref="HttpResponseMessage"/>.</param>
        /// <returns>An instance of <see cref="SpotifyApiError"/>.</returns>
        public static async Task <SpotifyApiError> ReadErrorResponse(HttpResponseMessage response)
        {
            // if no content
            if (response.Content == null)
            {
                return(null);
            }

            // if not JSON content type
            if (response.Content.Headers.ContentType?.MediaType != "application/json")
            {
                return(null);
            }

            var content = await response.Content.ReadAsStringAsync();

            Logger.Debug(content, nameof(SpotifyApiErrorException));

            // if empty body
            if (string.IsNullOrWhiteSpace(content))
            {
                return(null);
            }

            var error = new SpotifyApiError {
                Json = content
            };

            // interrogate properties to detect error json type
            var deserialized = JsonConvert.DeserializeObject(content) as JObject;

            // if no error property
            if (!deserialized.ContainsKey("error"))
            {
                return(error);
            }

            switch (deserialized["error"].Type)
            {
            case JTokenType.Object:
                error.Message = deserialized["error"].Value <string>("message");
                break;

            case JTokenType.String:
                error.Message = deserialized["error_description"].Value <string>();
                break;
            }

            return(error);
        }
 public SpotifyApiErrorException(HttpStatusCode statusCode, SpotifyApiError spotifyApiError) : base(spotifyApiError?.Message)
 {
     HttpStatusCode  = statusCode;
     SpotifyApiError = spotifyApiError;
 }