virtual_file_system/
directory.rs

1use 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}