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}