fsevent.rs

  1#[cfg(target_os = "macos")]
  2pub use mac_impl::*;
  3
  4use bitflags::bitflags;
  5use std::path::PathBuf;
  6
  7#[cfg(target_os = "macos")]
  8mod mac_impl;
  9
 10#[derive(Clone, Debug)]
 11pub struct Event {
 12    pub event_id: u64,
 13    pub flags: StreamFlags,
 14    pub path: PathBuf,
 15}
 16
 17// Synchronize with
 18// /System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/FSEvents.framework/Versions/A/Headers/FSEvents.h
 19bitflags! {
 20  #[repr(C)]
 21  pub struct StreamFlags: u32 {
 22    const NONE = 0x00000000;
 23    const MUST_SCAN_SUBDIRS = 0x00000001;
 24    const USER_DROPPED = 0x00000002;
 25    const KERNEL_DROPPED = 0x00000004;
 26    const IDS_WRAPPED = 0x00000008;
 27    const HISTORY_DONE = 0x00000010;
 28    const ROOT_CHANGED = 0x00000020;
 29    const MOUNT = 0x00000040;
 30    const UNMOUNT = 0x00000080;
 31    const ITEM_CREATED = 0x00000100;
 32    const ITEM_REMOVED = 0x00000200;
 33    const INODE_META_MOD = 0x00000400;
 34    const ITEM_RENAMED = 0x00000800;
 35    const ITEM_MODIFIED = 0x00001000;
 36    const FINDER_INFO_MOD = 0x00002000;
 37    const ITEM_CHANGE_OWNER = 0x00004000;
 38    const ITEM_XATTR_MOD = 0x00008000;
 39    const IS_FILE = 0x00010000;
 40    const IS_DIR = 0x00020000;
 41    const IS_SYMLINK = 0x00040000;
 42    const OWN_EVENT = 0x00080000;
 43    const IS_HARDLINK = 0x00100000;
 44    const IS_LAST_HARDLINK = 0x00200000;
 45    const ITEM_CLONED = 0x400000;
 46  }
 47}
 48
 49impl std::fmt::Display for StreamFlags {
 50    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
 51        if self.contains(StreamFlags::MUST_SCAN_SUBDIRS) {
 52            let _d = write!(f, "MUST_SCAN_SUBDIRS ");
 53        }
 54        if self.contains(StreamFlags::USER_DROPPED) {
 55            let _d = write!(f, "USER_DROPPED ");
 56        }
 57        if self.contains(StreamFlags::KERNEL_DROPPED) {
 58            let _d = write!(f, "KERNEL_DROPPED ");
 59        }
 60        if self.contains(StreamFlags::IDS_WRAPPED) {
 61            let _d = write!(f, "IDS_WRAPPED ");
 62        }
 63        if self.contains(StreamFlags::HISTORY_DONE) {
 64            let _d = write!(f, "HISTORY_DONE ");
 65        }
 66        if self.contains(StreamFlags::ROOT_CHANGED) {
 67            let _d = write!(f, "ROOT_CHANGED ");
 68        }
 69        if self.contains(StreamFlags::MOUNT) {
 70            let _d = write!(f, "MOUNT ");
 71        }
 72        if self.contains(StreamFlags::UNMOUNT) {
 73            let _d = write!(f, "UNMOUNT ");
 74        }
 75        if self.contains(StreamFlags::ITEM_CREATED) {
 76            let _d = write!(f, "ITEM_CREATED ");
 77        }
 78        if self.contains(StreamFlags::ITEM_REMOVED) {
 79            let _d = write!(f, "ITEM_REMOVED ");
 80        }
 81        if self.contains(StreamFlags::INODE_META_MOD) {
 82            let _d = write!(f, "INODE_META_MOD ");
 83        }
 84        if self.contains(StreamFlags::ITEM_RENAMED) {
 85            let _d = write!(f, "ITEM_RENAMED ");
 86        }
 87        if self.contains(StreamFlags::ITEM_MODIFIED) {
 88            let _d = write!(f, "ITEM_MODIFIED ");
 89        }
 90        if self.contains(StreamFlags::FINDER_INFO_MOD) {
 91            let _d = write!(f, "FINDER_INFO_MOD ");
 92        }
 93        if self.contains(StreamFlags::ITEM_CHANGE_OWNER) {
 94            let _d = write!(f, "ITEM_CHANGE_OWNER ");
 95        }
 96        if self.contains(StreamFlags::ITEM_XATTR_MOD) {
 97            let _d = write!(f, "ITEM_XATTR_MOD ");
 98        }
 99        if self.contains(StreamFlags::IS_FILE) {
100            let _d = write!(f, "IS_FILE ");
101        }
102        if self.contains(StreamFlags::IS_DIR) {
103            let _d = write!(f, "IS_DIR ");
104        }
105        if self.contains(StreamFlags::IS_SYMLINK) {
106            let _d = write!(f, "IS_SYMLINK ");
107        }
108        if self.contains(StreamFlags::OWN_EVENT) {
109            let _d = write!(f, "OWN_EVENT ");
110        }
111        if self.contains(StreamFlags::IS_LAST_HARDLINK) {
112            let _d = write!(f, "IS_LAST_HARDLINK ");
113        }
114        if self.contains(StreamFlags::IS_HARDLINK) {
115            let _d = write!(f, "IS_HARDLINK ");
116        }
117        if self.contains(StreamFlags::ITEM_CLONED) {
118            let _d = write!(f, "ITEM_CLONED ");
119        }
120        write!(f, "")
121    }
122}