         self.mimeType = mimeType
     }
 
+    /// The method being used for providing form data.
     public let provider: FormDataProvider
+
+    /// The name.
     public let name: String
+
+    /// The file name.
     public let fileName: String?
+
+    /// The MIME type
     public let mimeType: String?
 }

import Foundation
import Alamofire

/// Protocol to define the base URL, path, method, parameters and sample data for a target.
public protocol TargetType {
    var baseURL: URL { get }
    var path: String { get }
    var method: Moya.Method { get }
    var parameters: [String: Any]? { get }
    var parameterEncoding: ParameterEncoding { get } // Defaults to `URLEncoding`
    var sampleData: Data { get }
    var task: Task { get }
    var validate: Bool { get } // Alamofire validation (defaults to `false`)
}

public extension TargetType {

    }
}

/// Controls stub responses are returned.
public enum StubBehavior {

    /// Never return  a response.
    case never

    /// Return a response immediately.
    case immediate

    /// Return a response after a delay.
    case delayed(seconds: TimeInterval)
}

/// Represents a type of upload task.
public enum UploadType {

    /// Upload a file.
    case file(URL)

    /// Upload "multipart/form-data"
    case multipart([MultipartFormData])
}

/// Represents a type of download task.
public enum DownloadType {

    /// Download a file to a destination.
    case request(DownloadDestination)
}

/// Represents an HTTP task.
public enum Task {

    /// A basic request task.
    case request

    /// An upload task.
    case upload(UploadType)

    /// A download task.
    case download(DownloadType)
}

/// Represents "multipart/form-data" for an upload.
public struct MultipartFormData {

    /// Method to provide the form data.
    public enum FormDataProvider {
        case data(Foundation.Data)
        case file(URL)
        case stream(InputStream, UInt64)
    }

    /// Initialize a new `MultipartFormData`.
    public init(provider: FormDataProvider, name: String, fileName: String? = nil, mimeType: String? = nil) {
        self.provider = provider
        self.name = name
