/*
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/

'use strict'

var _ = require('lodash')

var UsergridResponseError = function(responseErrorObject) {
    if (_.get(responseErrorObject,'error') === false) {
        return
    }
    this.name = responseErrorObject.error
    this.description = responseErrorObject.error_description || responseErrorObject.description
    this.exception = responseErrorObject.exception
    return this
}

module.exports = UsergridResponseError