1 | // See https://en.wikipedia.org/wiki/Tar_%28computing%29#UStar_format |
2 | /// Indicate for the type of file described by a header. |
3 | /// |
4 | /// Each `Header` has an `entry_type` method returning an instance of this type |
5 | /// which can be used to inspect what the header is describing. |
6 | |
7 | /// A non-exhaustive enum representing the possible entry types |
8 | #[derive (Clone, Copy, PartialEq, Eq, Debug)] |
9 | pub enum EntryType { |
10 | /// Regular file |
11 | Regular, |
12 | /// Hard link |
13 | Link, |
14 | /// Symbolic link |
15 | Symlink, |
16 | /// Character device |
17 | Char, |
18 | /// Block device |
19 | Block, |
20 | /// Directory |
21 | Directory, |
22 | /// Named pipe (fifo) |
23 | Fifo, |
24 | /// Implementation-defined 'high-performance' type, treated as regular file |
25 | Continuous, |
26 | /// GNU extension - long file name |
27 | GNULongName, |
28 | /// GNU extension - long link name (link target) |
29 | GNULongLink, |
30 | /// GNU extension - sparse file |
31 | GNUSparse, |
32 | /// Global extended header |
33 | XGlobalHeader, |
34 | /// Extended Header |
35 | XHeader, |
36 | /// Hints that destructuring should not be exhaustive. |
37 | /// |
38 | /// This enum may grow additional variants, so this makes sure clients |
39 | /// don't count on exhaustive matching. (Otherwise, adding a new variant |
40 | /// could break existing code.) |
41 | #[doc (hidden)] |
42 | __Nonexhaustive(u8), |
43 | } |
44 | |
45 | impl EntryType { |
46 | /// Creates a new entry type from a raw byte. |
47 | /// |
48 | /// Note that the other named constructors of entry type may be more |
49 | /// appropriate to create a file type from. |
50 | pub fn new(byte: u8) -> EntryType { |
51 | match byte { |
52 | b' \x00' | b'0' => EntryType::Regular, |
53 | b'1' => EntryType::Link, |
54 | b'2' => EntryType::Symlink, |
55 | b'3' => EntryType::Char, |
56 | b'4' => EntryType::Block, |
57 | b'5' => EntryType::Directory, |
58 | b'6' => EntryType::Fifo, |
59 | b'7' => EntryType::Continuous, |
60 | b'x' => EntryType::XHeader, |
61 | b'g' => EntryType::XGlobalHeader, |
62 | b'L' => EntryType::GNULongName, |
63 | b'K' => EntryType::GNULongLink, |
64 | b'S' => EntryType::GNUSparse, |
65 | b => EntryType::__Nonexhaustive(b), |
66 | } |
67 | } |
68 | |
69 | /// Returns the raw underlying byte that this entry type represents. |
70 | pub fn as_byte(&self) -> u8 { |
71 | match *self { |
72 | EntryType::Regular => b'0' , |
73 | EntryType::Link => b'1' , |
74 | EntryType::Symlink => b'2' , |
75 | EntryType::Char => b'3' , |
76 | EntryType::Block => b'4' , |
77 | EntryType::Directory => b'5' , |
78 | EntryType::Fifo => b'6' , |
79 | EntryType::Continuous => b'7' , |
80 | EntryType::XHeader => b'x' , |
81 | EntryType::XGlobalHeader => b'g' , |
82 | EntryType::GNULongName => b'L' , |
83 | EntryType::GNULongLink => b'K' , |
84 | EntryType::GNUSparse => b'S' , |
85 | EntryType::__Nonexhaustive(b) => b, |
86 | } |
87 | } |
88 | |
89 | /// Creates a new entry type representing a regular file. |
90 | pub fn file() -> EntryType { |
91 | EntryType::Regular |
92 | } |
93 | |
94 | /// Creates a new entry type representing a hard link. |
95 | pub fn hard_link() -> EntryType { |
96 | EntryType::Link |
97 | } |
98 | |
99 | /// Creates a new entry type representing a symlink. |
100 | pub fn symlink() -> EntryType { |
101 | EntryType::Symlink |
102 | } |
103 | |
104 | /// Creates a new entry type representing a character special device. |
105 | pub fn character_special() -> EntryType { |
106 | EntryType::Char |
107 | } |
108 | |
109 | /// Creates a new entry type representing a block special device. |
110 | pub fn block_special() -> EntryType { |
111 | EntryType::Block |
112 | } |
113 | |
114 | /// Creates a new entry type representing a directory. |
115 | pub fn dir() -> EntryType { |
116 | EntryType::Directory |
117 | } |
118 | |
119 | /// Creates a new entry type representing a FIFO. |
120 | pub fn fifo() -> EntryType { |
121 | EntryType::Fifo |
122 | } |
123 | |
124 | /// Creates a new entry type representing a contiguous file. |
125 | pub fn contiguous() -> EntryType { |
126 | EntryType::Continuous |
127 | } |
128 | |
129 | /// Returns whether this type represents a regular file. |
130 | pub fn is_file(&self) -> bool { |
131 | self == &EntryType::Regular |
132 | } |
133 | |
134 | /// Returns whether this type represents a hard link. |
135 | pub fn is_hard_link(&self) -> bool { |
136 | self == &EntryType::Link |
137 | } |
138 | |
139 | /// Returns whether this type represents a symlink. |
140 | pub fn is_symlink(&self) -> bool { |
141 | self == &EntryType::Symlink |
142 | } |
143 | |
144 | /// Returns whether this type represents a character special device. |
145 | pub fn is_character_special(&self) -> bool { |
146 | self == &EntryType::Char |
147 | } |
148 | |
149 | /// Returns whether this type represents a block special device. |
150 | pub fn is_block_special(&self) -> bool { |
151 | self == &EntryType::Block |
152 | } |
153 | |
154 | /// Returns whether this type represents a directory. |
155 | pub fn is_dir(&self) -> bool { |
156 | self == &EntryType::Directory |
157 | } |
158 | |
159 | /// Returns whether this type represents a FIFO. |
160 | pub fn is_fifo(&self) -> bool { |
161 | self == &EntryType::Fifo |
162 | } |
163 | |
164 | /// Returns whether this type represents a contiguous file. |
165 | pub fn is_contiguous(&self) -> bool { |
166 | self == &EntryType::Continuous |
167 | } |
168 | |
169 | /// Returns whether this type represents a GNU long name header. |
170 | pub fn is_gnu_longname(&self) -> bool { |
171 | self == &EntryType::GNULongName |
172 | } |
173 | |
174 | /// Returns whether this type represents a GNU sparse header. |
175 | pub fn is_gnu_sparse(&self) -> bool { |
176 | self == &EntryType::GNUSparse |
177 | } |
178 | |
179 | /// Returns whether this type represents a GNU long link header. |
180 | pub fn is_gnu_longlink(&self) -> bool { |
181 | self == &EntryType::GNULongLink |
182 | } |
183 | |
184 | /// Returns whether this type represents a GNU long name header. |
185 | pub fn is_pax_global_extensions(&self) -> bool { |
186 | self == &EntryType::XGlobalHeader |
187 | } |
188 | |
189 | /// Returns whether this type represents a GNU long link header. |
190 | pub fn is_pax_local_extensions(&self) -> bool { |
191 | self == &EntryType::XHeader |
192 | } |
193 | } |
194 | |