Skip to main content

ex_cli/fs/
flags.rs

1use std::fs::FileType;
2
3#[derive(Clone, Copy, PartialEq)]
4pub enum FileFlags {
5    File,   // (regular files)
6    Dir,    // (directories)
7    Link,   // (symbolic links)
8    Block,  // (block files, e.g. disk devices)
9    Char,   // (character files, e.g. serial ports)
10    Pipe,   // (named pipes)
11    Socket, // (socket files)
12    Other,
13}
14
15impl FileFlags {
16    #[cfg(unix)]
17    pub fn from_type(file_type: FileType, zip_archive: bool) -> Self {
18        use std::os::unix::fs::FileTypeExt;
19        if file_type.is_dir() || zip_archive {
20            Self::Dir
21        } else if file_type.is_file() {
22            Self::File
23        } else if file_type.is_symlink() {
24            Self::Link
25        } else if file_type.is_block_device() {
26            Self::Block
27        } else if file_type.is_char_device() {
28            Self::Char
29        } else if file_type.is_fifo() {
30            Self::Pipe
31        } else if file_type.is_socket() {
32            Self::Socket
33        } else {
34            Self::Other
35        }
36    }
37
38    #[cfg(not(unix))]
39    pub fn from_type(file_type: FileType, zip_archive: bool) -> Self {
40        if file_type.is_dir() || zip_archive {
41            Self::Dir
42        } else if file_type.is_file() {
43            Self::File
44        } else if file_type.is_symlink() {
45            Self::Link
46        } else {
47            Self::Other
48        }
49    }
50
51    #[cfg(test)]
52    pub fn from_char(file_type: char) -> Self {
53        match file_type {
54            'f' => Self::File,
55            'd' => Self::Dir,
56            'l' => Self::Link,
57            _ => Self::Other,
58        }
59    }
60}