# Debugging

### Debugging

`VGSShowSDK` provides customizable configuration to debug and log potential issues. By default all logging options are disabled.

`VGSShowSDK` only prints formatted logs to your console. It does not record your activity to some persistent storage, local file, also we do not send your logging activity to any server.

You can turn on logging warnings and errros by changing `VGSLogger.shared` instance `configuration.level` property. You can also turn on `isNetworkDebugEnabled` property for logging `VGSShowSDK` network requests to verify whether request was successfull or failed.

```swift
// Log only warnings and errors.
VGSLogger.shared.configuration.level = .warning

// Log network requests.
VGSLogger.shared.configuration.isNetworkDebugEnabled = true
```

> You may always debug your setup with [Access Logger](https://docs.verygoodsecurity.com/vault/http-proxy/access-logger), by seeing requests statuses, payload diffs, matched information etc.

#### Log levels

`VGSShowSDK` provides the following log levels:

* **info**. Log *all* events including errors and warnings.
* **warning**. Log *only* events indicating warnings and errors.
* **none**. Log *no* events. Default setting.

```swift
/// Defines levels of logging.
public enum VGSLogLevel: String {
	/// Log *all* events including errors and warnings.
	case info

	/// Log *only* events indicating warnings and errors.
	case warning

	/// Log *no* events.
	case none
}
```

#### Disable logging

To disable all logging activities you can use `disableAllLoggers()` method of `VGSLogger.shared` instance. It will set log level to `.none` and stop network debugging.

```swift
if MyApp.shared.configuration == .prod {
    // Disable all loggers for your prod configuration and live apps.
	VGSLogger.shared.disableAllLoggers()
}
```

> You should NOT use logging in your production configurations for live applications.\\

#### Extensive logging

For extensive debugging and logging you can set log level to `.info` and `.isExtensiveDebugEnabled` option to `true`. You can turn on `.isExtensiveDebugEnabled` option for more verbose logs like file name, function name and line number where event was trigerred.

```swift
// Log all events.
VGSLogger.shared.configuration.level = .info

// Log network requests.
VGSLogger.shared.configuration.isNetworkDebugEnabled = true

// Add verbose information to logs.
VGSLogger.shared.configuration.isExtensiveDebugEnabled = true
```

## Errors Handling

This guide covers error handling features which will help you to make your App more reliable and recover from errors produced by `VGSShowSDK`.

### VGSShowError

An object `VGSShowSDK` use to produce errors inside the SDK. All `VGSShowSDK` errors are produced under `VGSShowSDKErrorDomain` domain.

#### Declaration

```swift
class VGSShowError: NSError
```

#### Attributes

| **Attribute**             | **Type/Description**                                     |
| ------------------------- | -------------------------------------------------------- |
| key                       | **String**, error key defined in `VGSErrorInfoKey.swift` |
| NSLocalizedDescriptionKey | **String**, error description for developer              |
| extraInfo                 | **Dictionary**, can contain additional error details     |

`VGSShowError` inherits iOS native `NSError` class and works similar. `VGSShowError` populates error codes, declared in `VGSErrorType`, and error keys, declared in [VGSShowSDK Reference docs](https://verygoodsecurity.github.io/vgs-show-ios/Enums/VGSErrorType.html).

#### Error codes

List of Error codes produced by VGS Show iOS SDK locally.

| **Code** | **Key**                        | **Description**                                |
| -------- | ------------------------------ | ---------------------------------------------- |
| 1400     | `unexpectedResponseType`       | When response type is not supported            |
| 1401     | `unexpectedResponseDataFormat` | When response data format is not supported     |
| 1402     | `responseIsInvalidJSON`        | When response cannot be decoded to json        |
| 1403     | `fieldNotFound`                | When field cannot be found with specified path |
| 1404     | `invalidJSONPayload`           | When payload is invalid JSON                   |
| 1405     | `invalidBase64Data`            | When base64 data is invalid                    |
| 1406     | `invalidPDFData`               | When PDF data is invalid                       |
| 1480     | `invalidConfigurationURL`      | When VGS configuration URL is not valid        |

#### Code example

```swift
vgsShow.request(path: "/post",
                payload: data) { (requestResult) in

    switch requestResult {

    case .failure(let code, let error):
        switch code {
        /// response type error
        case VGSErrorType.unexpectedResponseType.rawValue:
        /// handle error
        /// ...
        }
    }
}
```
