FileWatcher
FileWatcher copied to clipboard
Clean up FileWatcherEvent.swift
Use Enums? I'll make an example soonish
Proposal:
Need to get rid of event.test() and do some refactoring.
let fileWatcher = FileWatcher("url"){ event in
switch true {
case event.test(.fileChanged) : print("😊")
case event.test(.dirChanged) : print("🙁")
case event.test(.created) : print("😭")
default: fatalError("💥")
}
}
import Foundation
class FileWatcherEvent{
var id: FSEventStreamEventId
var path:String
var flags: FSEventStreamEventFlags
init(_ eventId:FSEventStreamEventId, _ eventPath: String, _ eventFlags: FSEventStreamEventFlags){
self.id = eventId
self.path = eventPath
self.flags = eventFlags
}
}
enum FileWatcherEventCoreType{//ineternal
case fileChange ,dirChange ,created ,removed ,renamed ,modified
}
enum FileWatcherEventType{//user centric
case fileCreated,fileRemoved,fileRenamed,fileModified, dirCreated, dirRemoved, dirRenamed, dirModified
}
extension FileWatcherEvent{
func test(_ type:FileWatcherEventType) -> Bool {
switch type{
/*File*/
case .fileCreated : return assert(.fileChange) && assert(.created)
case .fileRemoved : return assert(.fileChange) && assert(.removed)
case .fileRenamed : return assert(.fileChange) && assert(.renamed)
case .fileModified : return assert(.fileChange) && assert(.modified)
/*Directory*/
case .dirCreated : return assert(.dirChange) && assert(.created)
case .dirRemoved : return assert(.dirChange) && assert(.removed)
case .dirRenamed : return assert(.dirChange) && assert(.renamed)
case .dirModified : return assert(.dirChange) && assert(.modified)
}
}
func assert(_ type:FileWatcherEventCoreType) -> Bool {
switch type{
/*general*/
case .fileChange : return (flags & FSEventStreamEventFlags(kFSEventStreamEventFlagItemIsFile)) != 0
case .dirChange : return (flags & FSEventStreamEventFlags(kFSEventStreamEventFlagItemIsDir)) != 0
/*CRUD*/
case .created: return (flags & FSEventStreamEventFlags(kFSEventStreamEventFlagItemCreated)) != 0
case .removed: return (flags & FSEventStreamEventFlags(kFSEventStreamEventFlagItemRemoved)) != 0
case .renamed: return (flags & FSEventStreamEventFlags(kFSEventStreamEventFlagItemRenamed)) != 0
case .modified: return (flags & FSEventStreamEventFlags(kFSEventStreamEventFlagItemModified)) != 0
}
}
}
@paperlib I think I have an idea to make it better. Ill try tomorrow :D
@paperlib
- FSEventStreamEventFlags is captured
- Determine its FileWatcherEventType which is an enum
- Replace FileWatcherEvent.flags with
let type: FileWatcherEventType
- We can now have super nice
switch event.type {case .fileChanged: /*...*/;}
etc 🎉
Gonna code it up early next week. just bug me on slack if there is no progress. I think this is a really slick and simple solution. My first proposal just complicated things. Also the event can be a struct 🎉