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 #[derive(Debug, PartialEq, Eq, Clone, Copy)]
21 #[repr(C)]
22 pub struct StreamFlags: u32 {
23 const NONE = 0x00000000;
24 const MUST_SCAN_SUBDIRS = 0x00000001;
25 const USER_DROPPED = 0x00000002;
26 const KERNEL_DROPPED = 0x00000004;
27 const IDS_WRAPPED = 0x00000008;
28 const HISTORY_DONE = 0x00000010;
29 const ROOT_CHANGED = 0x00000020;
30 const MOUNT = 0x00000040;
31 const UNMOUNT = 0x00000080;
32 const ITEM_CREATED = 0x00000100;
33 const ITEM_REMOVED = 0x00000200;
34 const INODE_META_MOD = 0x00000400;
35 const ITEM_RENAMED = 0x00000800;
36 const ITEM_MODIFIED = 0x00001000;
37 const FINDER_INFO_MOD = 0x00002000;
38 const ITEM_CHANGE_OWNER = 0x00004000;
39 const ITEM_XATTR_MOD = 0x00008000;
40 const IS_FILE = 0x00010000;
41 const IS_DIR = 0x00020000;
42 const IS_SYMLINK = 0x00040000;
43 const OWN_EVENT = 0x00080000;
44 const IS_HARDLINK = 0x00100000;
45 const IS_LAST_HARDLINK = 0x00200000;
46 const ITEM_CLONED = 0x400000;
47 }
48}
49
50impl std::fmt::Display for StreamFlags {
51 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
52 if self.contains(StreamFlags::MUST_SCAN_SUBDIRS) {
53 let _d = write!(f, "MUST_SCAN_SUBDIRS ");
54 }
55 if self.contains(StreamFlags::USER_DROPPED) {
56 let _d = write!(f, "USER_DROPPED ");
57 }
58 if self.contains(StreamFlags::KERNEL_DROPPED) {
59 let _d = write!(f, "KERNEL_DROPPED ");
60 }
61 if self.contains(StreamFlags::IDS_WRAPPED) {
62 let _d = write!(f, "IDS_WRAPPED ");
63 }
64 if self.contains(StreamFlags::HISTORY_DONE) {
65 let _d = write!(f, "HISTORY_DONE ");
66 }
67 if self.contains(StreamFlags::ROOT_CHANGED) {
68 let _d = write!(f, "ROOT_CHANGED ");
69 }
70 if self.contains(StreamFlags::MOUNT) {
71 let _d = write!(f, "MOUNT ");
72 }
73 if self.contains(StreamFlags::UNMOUNT) {
74 let _d = write!(f, "UNMOUNT ");
75 }
76 if self.contains(StreamFlags::ITEM_CREATED) {
77 let _d = write!(f, "ITEM_CREATED ");
78 }
79 if self.contains(StreamFlags::ITEM_REMOVED) {
80 let _d = write!(f, "ITEM_REMOVED ");
81 }
82 if self.contains(StreamFlags::INODE_META_MOD) {
83 let _d = write!(f, "INODE_META_MOD ");
84 }
85 if self.contains(StreamFlags::ITEM_RENAMED) {
86 let _d = write!(f, "ITEM_RENAMED ");
87 }
88 if self.contains(StreamFlags::ITEM_MODIFIED) {
89 let _d = write!(f, "ITEM_MODIFIED ");
90 }
91 if self.contains(StreamFlags::FINDER_INFO_MOD) {
92 let _d = write!(f, "FINDER_INFO_MOD ");
93 }
94 if self.contains(StreamFlags::ITEM_CHANGE_OWNER) {
95 let _d = write!(f, "ITEM_CHANGE_OWNER ");
96 }
97 if self.contains(StreamFlags::ITEM_XATTR_MOD) {
98 let _d = write!(f, "ITEM_XATTR_MOD ");
99 }
100 if self.contains(StreamFlags::IS_FILE) {
101 let _d = write!(f, "IS_FILE ");
102 }
103 if self.contains(StreamFlags::IS_DIR) {
104 let _d = write!(f, "IS_DIR ");
105 }
106 if self.contains(StreamFlags::IS_SYMLINK) {
107 let _d = write!(f, "IS_SYMLINK ");
108 }
109 if self.contains(StreamFlags::OWN_EVENT) {
110 let _d = write!(f, "OWN_EVENT ");
111 }
112 if self.contains(StreamFlags::IS_LAST_HARDLINK) {
113 let _d = write!(f, "IS_LAST_HARDLINK ");
114 }
115 if self.contains(StreamFlags::IS_HARDLINK) {
116 let _d = write!(f, "IS_HARDLINK ");
117 }
118 if self.contains(StreamFlags::ITEM_CLONED) {
119 let _d = write!(f, "ITEM_CLONED ");
120 }
121 write!(f, "")
122 }
123}