virtual_file_system/
directory.rs1use core::fmt::Debug;
2
3use file_system::{Entry, Path, Result, UniqueFileIdentifier};
4use futures::block_on;
5use task::TaskIdentifier;
6
7use crate::VirtualFileSystem;
8
9pub struct Directory<'a> {
10 directory_identifier: UniqueFileIdentifier,
11 virtual_file_system: &'a VirtualFileSystem<'a>,
12 task: TaskIdentifier,
13}
14
15impl Debug for Directory<'_> {
16 fn fmt(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
17 formatter
18 .debug_struct("Directory_type")
19 .field("File_identifier", &self.directory_identifier)
20 .field(
21 "Virtual_file_system",
22 &(self.virtual_file_system as *const _),
23 )
24 .finish()
25 }
26}
27
28impl Directory<'_> {
29 pub async fn create<'a>(
30 virtual_file_system: &'a VirtualFileSystem<'a>,
31 path: impl AsRef<Path>,
32 ) -> Result<()> {
33 let task = task::get_instance().get_current_task_identifier().await;
34
35 virtual_file_system.create_directory(&path, task).await
36 }
37
38 pub async fn open<'a>(
39 virtual_file_system: &'a VirtualFileSystem<'a>,
40 path: impl AsRef<Path>,
41 ) -> Result<Directory<'a>> {
42 let task = task::get_instance().get_current_task_identifier().await;
43
44 let directory_identifier = virtual_file_system.open_directory(&path, task).await?;
45
46 Ok(Directory {
47 directory_identifier,
48 virtual_file_system,
49 task,
50 })
51 }
52
53 pub async fn read(&self) -> Result<Option<Entry>> {
54 self.virtual_file_system
55 .read_directory(self.directory_identifier, self.task)
56 .await
57 }
58}
59
60impl Drop for Directory<'_> {
61 fn drop(&mut self) {
62 block_on(
63 self.virtual_file_system
64 .close_directory(self.directory_identifier, self.task),
65 )
66 .unwrap();
67 }
68}
69
70impl Iterator for Directory<'_> {
71 type Item = Entry;
72
73 fn next(&mut self) -> Option<Self::Item> {
74 block_on(self.read()).unwrap()
75 }
76}