From ab7ec33418fe89cf0f07d82ac1b26d8fca58b810 Mon Sep 17 00:00:00 2001 From: Wojciech Nagrodzki <278594+wnagrodzki@users.noreply.github.com> Date: Tue, 28 Aug 2018 20:01:26 +0200 Subject: [PATCH] Uncoupled FileWriter from FileHandle --- Logger/Loggers/DiskLogger/DiskLogger.swift | 12 ++++++++++- Logger/Loggers/DiskLogger/FileWriter.swift | 25 ++++++++++++++++------ 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/Logger/Loggers/DiskLogger/DiskLogger.swift b/Logger/Loggers/DiskLogger/DiskLogger.swift index 5eebbb5..6718d09 100644 --- a/Logger/Loggers/DiskLogger/DiskLogger.swift +++ b/Logger/Loggers/DiskLogger/DiskLogger.swift @@ -172,6 +172,16 @@ private class FileRotateFactory: LogrotateFactory { private class FileWriterFactory: SizeLimitedFileFactory { func makeInstance(fileURL: URL, fileSizeLimit: UInt64) throws -> SizeLimitedFile { - return try FileWriter(fileURL: fileURL, fileSizeLimit: fileSizeLimit) + return try FileWriter(fileURL: fileURL, fileSizeLimit: fileSizeLimit, fileFactory: FileHandleFactory()) } } + +private class FileHandleFactory: FileFactory { + func makeInstance(forWritingTo: URL) throws -> File { + return try FileHandle(forWritingTo: forWritingTo) + } +} + +extension FileHandle: File { + +} diff --git a/Logger/Loggers/DiskLogger/FileWriter.swift b/Logger/Loggers/DiskLogger/FileWriter.swift index 471703d..be1ff30 100644 --- a/Logger/Loggers/DiskLogger/FileWriter.swift +++ b/Logger/Loggers/DiskLogger/FileWriter.swift @@ -24,10 +24,21 @@ import Foundation +protocol File { + func seekToEndOfFile() -> UInt64 + func swift_write(_ data: Data) throws + func synchronizeFile() + func closeFile() +} + +protocol FileFactory { + func makeInstance(forWritingTo: URL) throws -> File +} + /// Allows writing to a file while respecting allowed size limit. final class FileWriter { - private let handle: FileHandle + private let file: File private let sizeLimit: UInt64 private var currentSize: UInt64 @@ -37,10 +48,10 @@ final class FileWriter { /// - fileURL: URL of the file. /// - fileSizeLimit: Maximum size the file can reach in bytes. /// - Throws: An error that may occur while the file is being opened for writing. - init(fileURL: URL, fileSizeLimit: UInt64) throws { - handle = try FileHandle(forWritingTo: fileURL) + init(fileURL: URL, fileSizeLimit: UInt64, fileFactory: FileFactory) throws { + file = try fileFactory.makeInstance(forWritingTo: fileURL) self.sizeLimit = fileSizeLimit - currentSize = handle.seekToEndOfFile() + currentSize = file.seekToEndOfFile() } } @@ -51,12 +62,12 @@ extension FileWriter: SizeLimitedFile { guard currentSize + dataSize <= sizeLimit else { throw SizeLimitedFileQuotaReached() } - try handle.swift_write(data) + try file.swift_write(data) currentSize += dataSize } func synchronizeAndCloseFile() { - handle.synchronizeFile() - handle.closeFile() + file.synchronizeFile() + file.closeFile() } }