FileWatcher icon indicating copy to clipboard operation
FileWatcher copied to clipboard

Clean up FileWatcherEvent.swift

Open eonist opened this issue 7 years ago • 3 comments

Use Enums? I'll make an example soonish

eonist avatar May 10 '17 20:05 eonist

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
        }
    }
}


eonist avatar May 12 '17 23:05 eonist

@paperlib I think I have an idea to make it better. Ill try tomorrow :D

eonist avatar May 12 '17 23:05 eonist

@paperlib

  1. FSEventStreamEventFlags is captured
  2. Determine its FileWatcherEventType which is an enum
  3. Replace FileWatcherEvent.flags with let type: FileWatcherEventType
  4. 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 🎉

eonist avatar May 14 '17 18:05 eonist