浏览代码

Minor refactoring in FileSystemWatcher.

父节点
当前提交
972b09b445
共有 1 个文件被更改,包括 26 次插入28 次删除
  1. 26
    28
      src/file_system_watcher.rs

+ 26
- 28
src/file_system_watcher.rs 查看文件

24
         // Spawn the task that watches the file system as soon as unpause() is called.
24
         // Spawn the task that watches the file system as soon as unpause() is called.
25
         let (state_send, pause_receive) = mpsc::channel(1);
25
         let (state_send, pause_receive) = mpsc::channel(1);
26
         tokio::spawn(async move {
26
         tokio::spawn(async move {
27
-            Self::task_paused(file_tree, pause_receive, errors).await;
27
+            let mut fsw_task = FileSystemWatcherTask { file_tree, errors };
28
+            fsw_task.task_paused(pause_receive).await;
28
         });
29
         });
29
 
30
 
30
         Ok(FileSystemWatcher { state_send })
31
         Ok(FileSystemWatcher { state_send })
47
             .unwrap();
48
             .unwrap();
48
         receive.await.unwrap();
49
         receive.await.unwrap();
49
     }
50
     }
51
+}
52
+
53
+struct FileSystemWatcherTask {
54
+    file_tree: Arc<Mutex<FileTree>>,
55
+    errors: mpsc::Sender<SynchronizationError>,
56
+}
50
 
57
 
58
+impl FileSystemWatcherTask {
51
     async fn task_paused(
59
     async fn task_paused(
52
-        mut file_tree: Arc<Mutex<FileTree>>,
60
+        &mut self,
53
         mut state_receive: mpsc::Receiver<(StateChange, oneshot::Sender<()>)>,
61
         mut state_receive: mpsc::Receiver<(StateChange, oneshot::Sender<()>)>,
54
-        mut errors: mpsc::Sender<SynchronizationError>,
55
     ) {
62
     ) {
56
         let mut paused = true;
63
         let mut paused = true;
57
 
64
 
68
             } else {
75
             } else {
69
                 // We were unpaused, initialize the file system watcher and start waiting for
76
                 // We were unpaused, initialize the file system watcher and start waiting for
70
                 // that as well.
77
                 // that as well.
71
-                let next_state =
72
-                    Self::task_unpaused(&mut file_tree, &mut state_receive, &mut errors).await;
78
+                let next_state = self.task_unpaused(&mut state_receive).await;
73
                 match next_state {
79
                 match next_state {
74
                     StateChange::Pause => paused = true,
80
                     StateChange::Pause => paused = true,
75
                     StateChange::Unpause => paused = false,
81
                     StateChange::Unpause => paused = false,
80
     }
86
     }
81
 
87
 
82
     async fn task_unpaused(
88
     async fn task_unpaused(
83
-        file_tree: &mut Arc<Mutex<FileTree>>,
89
+        &mut self,
84
         state_receive: &mut mpsc::Receiver<(StateChange, oneshot::Sender<()>)>,
90
         state_receive: &mut mpsc::Receiver<(StateChange, oneshot::Sender<()>)>,
85
-        errors: &mut mpsc::Sender<SynchronizationError>,
86
     ) -> StateChange {
91
     ) -> StateChange {
87
-        let root_path = file_tree.lock().await.root_path().to_owned();
92
+        let root_path = self.file_tree.lock().await.root_path().to_owned();
88
         let fsw = match fswatcher::FileSystemWatcher::new(&root_path) {
93
         let fsw = match fswatcher::FileSystemWatcher::new(&root_path) {
89
             Ok(fsw) => fsw,
94
             Ok(fsw) => fsw,
90
-            Err(e) => return Self::wait_for_pause(e.into(), state_receive, errors).await,
95
+            Err(e) => return self.wait_for_pause(e.into(), state_receive).await,
91
         };
96
         };
92
         let mut file_events = FileEventDelay::new(fsw, Duration::from_secs(3));
97
         let mut file_events = FileEventDelay::new(fsw, Duration::from_secs(3));
93
 
98
 
100
                 Either::Left((event, _state_future)) => {
105
                 Either::Left((event, _state_future)) => {
101
                     // We cannot get any end-of-stream None here - we would first get a "Stopped"
106
                     // We cannot get any end-of-stream None here - we would first get a "Stopped"
102
                     // file event.
107
                     // file event.
103
-                    if let Err(error) =
104
-                        Self::handle_file_event(file_tree, errors, event.unwrap()).await
105
-                    {
108
+                    if let Err(error) = self.handle_file_event(event.unwrap()).await {
106
                         error_needs_pause = Some(error);
109
                         error_needs_pause = Some(error);
107
                     }
110
                     }
108
                 }
111
                 }
118
                 }
121
                 }
119
             };
122
             };
120
         }
123
         }
121
-        return Self::wait_for_pause(error_needs_pause.unwrap(), state_receive, errors).await;
124
+        return self
125
+            .wait_for_pause(error_needs_pause.unwrap(), state_receive)
126
+            .await;
122
     }
127
     }
123
 
128
 
124
     async fn wait_for_pause(
129
     async fn wait_for_pause(
130
+        &mut self,
125
         reason: Error,
131
         reason: Error,
126
         state_receive: &mut mpsc::Receiver<(StateChange, oneshot::Sender<()>)>,
132
         state_receive: &mut mpsc::Receiver<(StateChange, oneshot::Sender<()>)>,
127
-        errors: &mut mpsc::Sender<SynchronizationError>,
128
     ) -> StateChange {
133
     ) -> StateChange {
129
-        match errors
134
+        match self
135
+            .errors
130
             .send(SynchronizationError {
136
             .send(SynchronizationError {
131
                 needs_pause: true,
137
                 needs_pause: true,
132
                 error: reason,
138
                 error: reason,
148
         }
154
         }
149
     }
155
     }
150
 
156
 
151
-    async fn handle_file_event(
152
-        file_tree: &mut Arc<Mutex<FileTree>>,
153
-        errors: &mut mpsc::Sender<SynchronizationError>,
154
-        event: FileSystemEvent,
155
-    ) -> Result<(), Error> {
157
+    async fn handle_file_event(&mut self, event: FileSystemEvent) -> Result<(), Error> {
156
         // When we get an I/O error, we simply ignore the corresponding file/directory. Most
158
         // When we get an I/O error, we simply ignore the corresponding file/directory. Most
157
         // likely, it has been deleted, and we will get a deletion event later. If a file or
159
         // likely, it has been deleted, and we will get a deletion event later. If a file or
158
         // directory is not readable, we do not want to synchronize it.
160
         // directory is not readable, we do not want to synchronize it.
174
                     .filter(|x| x.is_ok())
176
                     .filter(|x| x.is_ok())
175
                     .map(|x| (x.as_ref().unwrap().file_name(), x.unwrap()))
177
                     .map(|x| (x.as_ref().unwrap().file_name(), x.unwrap()))
176
                     .collect::<HashMap<_, _>>();
178
                     .collect::<HashMap<_, _>>();
177
-                let db_entries = match file_tree.lock().await.get_directory_listing(&path) {
179
+                let db_entries = match self.file_tree.lock().await.get_directory_listing(&path) {
178
                     Some(entries) => entries,
180
                     Some(entries) => entries,
179
                     None => return Ok(()),
181
                     None => return Ok(()),
180
                 };
182
                 };
228
                 // TODO
230
                 // TODO
229
             }
231
             }
230
             FileSystemEvent::Error(e) => {
232
             FileSystemEvent::Error(e) => {
231
-                Self::send_error_no_pause(e.into(), None, errors).await;
233
+                self.send_error_no_pause(e.into(), None).await;
232
             }
234
             }
233
         }
235
         }
234
 
236
 
240
         Ok(())
242
         Ok(())
241
     }
243
     }
242
 
244
 
243
-    async fn send_error_no_pause(
244
-        error: Error,
245
-        _path: Option<OsString>,
246
-        errors: &mut mpsc::Sender<SynchronizationError>,
247
-    ) {
245
+    async fn send_error_no_pause(&mut self, error: Error, _path: Option<OsString>) {
248
         // TODO: Encode the path in the error!
246
         // TODO: Encode the path in the error!
249
-        errors
247
+        self.errors
250
             .send(SynchronizationError {
248
             .send(SynchronizationError {
251
                 needs_pause: false,
249
                 needs_pause: false,
252
                 error: error,
250
                 error: error,

正在加载...
取消
保存