--- /dev/null
+//
+// Tools.swift
+// alamofire_activity_logger
+//
+// Created by Manuel García-Estañ on 2/11/16.
+// Copyright © 2016 manuege. All rights reserved.
+//
+
+import Foundation
+
+internal let appIsDebugMode = _isDebugAssertConfiguration()
+
+// MARK: - Levels
+
+/**
+ Log levels
+
+ `none`
+ Do not log requests or responses.
+
+ `all`
+ Logs HTTP method, URL, header fields, & request body for requests, and status code, URL, header fields, response string, & elapsed time for responses.
+
+ `info`
+ Logs HTTP method & URL for requests, and status code, URL, & elapsed time for responses.
+
+ `error`
+ Logs HTTP method & URL for requests, and status code, URL, & elapsed time for responses, but only for failed requests.
+ */
+public enum LogLevel {
+ case none
+ case all
+ case info
+ case error
+}
+
+// MARK: - Options
+
+/**
+ Login options
+
+ `onlyDebug`
+ Only logs if the app is in Debug mode
+
+ `jsonPrettyPrint`
+ Prints the JSON body on request and response
+
+ `includeSeparator`
+ Include a separator string at the begining and end of each section
+ */
+public enum LogOption {
+ case onlyDebug
+ case jsonPrettyPrint
+ case includeSeparator
+
+ public static var defaultOptions: [LogOption] {
+ return [.onlyDebug, .jsonPrettyPrint, .includeSeparator]
+ }
+}
+
+// MARK: - Printer
+
+/**
+ The different phases of a request that can be printed
+
+ `request`
+ The request when it is sent
+
+ `response`
+ The response when it is received; includes a parameter `success` that inform if the response has finished succesfully
+*/
+public enum Phase {
+ case request
+ case response(success: Bool)
+
+ /// Tells if there is an error in the phase
+ public var isError: Bool {
+ switch self {
+ case let .response(success):
+ return !success
+ case .request:
+ return false
+ }
+ }
+}
+
+/// Instances that conforms with `Printer` protocol are able to print the information from a given request
+public protocol Printer {
+
+ /**
+ This method is called when the printer is requested to print a string. Use it to print the information in the way you need.
+ - parameter string: The string to be printed.
+ - parameter phase: The phase of the request that needs to be printed
+ */
+ func print(_ string: String, phase: Phase)
+}
+
+/// A printer that just use the native `Swift.print` function to print the string.
+public struct NativePrinter: Printer {
+
+ /// Creates a new instance
+ public init() {}
+
+ public func print(_ string: String, phase: Phase) {
+ Swift.print(string)
+ }
+}