@@ -106,14 +106,14 @@ extension LoggerMiddleware {
106106 /// Logs using os_log.
107107 case osLog
108108 /// Appends the messages to a file. The file must exist!
109- case file( URL , DateFormatter )
109+ case file( FileAppender )
110110 /// A custom handler.
111111 case custom( ( String ) -> Void )
112112
113113 func log( state: String ) {
114114 switch self {
115115 case . osLog: LoggerMiddleware . osLog ( state)
116- case let . file( url , dateFormatter ) : LoggerMiddleware . fileLog ( state, to : url , dateFormatter : dateFormatter )
116+ case let . file( fileAppender ) : fileAppender . write ( state)
117117 case let . custom( closure) : closure ( state)
118118 }
119119 }
@@ -241,14 +241,14 @@ extension LoggerMiddleware {
241241 /// Logs using os_log.
242242 case osLog
243243 /// Appends the messages to a file. The file must exist!
244- case file( URL , DateFormatter )
244+ case file( FileAppender )
245245 /// A custom handler.
246246 case custom( ( String ) -> Void )
247247
248248 func log( action: String ) {
249249 switch self {
250250 case . osLog: LoggerMiddleware . osLog ( action)
251- case let . file( url , dateFormatter ) : LoggerMiddleware . fileLog ( action, to : url , dateFormatter : dateFormatter )
251+ case let . file( fileappender ) : fileappender . write ( action)
252252 case let . custom( closure) : closure ( action)
253253 }
254254 }
@@ -279,17 +279,44 @@ extension LoggerMiddleware {
279279
280280extension LoggerMiddleware {
281281
282- fileprivate static func fileLog( _ message: String , to fileURL: URL , dateFormatter: DateFormatter ) {
283- guard let fileUpdater = try ? FileHandle ( forUpdating: fileURL) ,
284- let data = ( dateFormatter. string ( from: Date ( ) ) + " " + message + " \n " )
285- . data ( using: String . Encoding. utf8) else { return }
286- fileUpdater. seekToEndOfFile ( )
287- fileUpdater. write ( data)
288- fileUpdater. closeFile ( )
289- }
290-
291282 fileprivate static func osLog( _ message: String ) {
292283 os_log ( . debug, log: . default, " %{PUBLIC}@ " , message)
293284 }
294285
295286}
287+
288+ public struct FileAppender {
289+ private let url : URL
290+ private let date : ( ) -> Date
291+ private let dateFormatter : DateFormatter
292+ private let writer : ( URL , Data ) -> Void
293+
294+ public init ( url: URL , date: @escaping ( ) -> Date , dateFormatter: DateFormatter , writer: @escaping ( URL , Data ) -> Void ) {
295+ self . url = url
296+ self . date = date
297+ self . dateFormatter = dateFormatter
298+ self . writer = writer
299+ }
300+
301+ public func write( _ message: String ) {
302+ guard let data = ( dateFormatter. string ( from: date ( ) ) + " " + message + " \n " ) . data ( using: String . Encoding. utf8) else { return }
303+ writer ( url, data)
304+ }
305+ }
306+
307+ extension FileAppender {
308+ public static func live( url: URL , dateFormatter: DateFormatter = . init( ) , date: @escaping ( ) -> Date = Date . init, fileHandle: @escaping ( URL ) throws -> FileHandle = FileHandle . init ( forUpdating: ) ) -> FileAppender {
309+ FileAppender (
310+ url: url,
311+ date: date,
312+ dateFormatter: dateFormatter,
313+ writer: { url, data in
314+ guard let fileUpdater = try ? fileHandle ( url) else { return }
315+ fileUpdater. seekToEndOfFile ( )
316+ fileUpdater. write ( data)
317+ fileUpdater. closeFile ( )
318+ }
319+ )
320+ }
321+ }
322+
0 commit comments