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)]
9pub 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
45impl 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