     /// - Parameters:
     ///   - closure: The closure to be called on failure.
     /// - Returns: `self` to enable consecutive method calls (e.g. `importer.startImportingRecords {...}.onProgress {...}`).
-    open func onFail(_ closure: @escaping () -> Void) -> Self {
+    public func onFail(_ closure: @escaping () -> Void) -> Self {
         self.failClosure = closure
         return self
     }

    /// - Parameters:
    ///   - mapper: A closure to map the data received in a line to your data structure.
    /// - Returns: `self` to enable consecutive method calls (e.g. `importer.startImportingRecords {...}.onProgress {...}`).
    open func startImportingRecords(mapper closure: @escaping (_ recordValues: [String]) -> T) -> Self {
        DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async {
            var importedRecords: [T] = []


    ///   - structure: A closure for doing something with the found structure within the first line of the CSV file.
    ///   - recordMapper: A closure to map the dictionary data interpreted from a line to your data structure.
    /// - Returns: `self` to enable consecutive method calls (e.g. `importer.startImportingRecords {...}.onProgress {...}`).
    public func startImportingRecords(structure structureClosure: @escaping (_ headerValues: [String]) -> Void, recordMapper closure: @escaping (_ recordValues: [String: String]) -> T) -> Self {
        DispatchQueue.global(qos: DispatchQoS.QoSClass.userInitiated).async {
            var recordStructure: [String]?
            var importedRecords: [T] = []
