@@ -21,7 +21,7 @@ use tokio::runtime::Builder;
21
21
/// let file_type = FileType::from_bytes(b"\xCA\xFE\xBA\xBE");
22
22
/// assert_eq!(file_type.name(), "Java Class File");
23
23
/// assert_eq!(file_type.media_types(), Vec::<String>::new());
24
- /// assert_eq!(file_type.extensions(), vec!["class".to_string() ]);
24
+ /// assert_eq!(file_type.extensions(), vec!["class"]);
25
25
/// ```
26
26
///
27
27
/// Detect text from bytes:
@@ -30,7 +30,7 @@ use tokio::runtime::Builder;
30
30
///
31
31
/// let file_type = FileType::from_bytes(b"hello, world\n");
32
32
/// assert_eq!(file_type.name(), "Text");
33
- /// assert_eq!(file_type.media_types(), vec!["text/plain".to_string() ]);
33
+ /// assert_eq!(file_type.media_types(), vec!["text/plain"]);
34
34
/// assert_eq!(file_type.extensions(), Vec::<String>::new());
35
35
/// ```
36
36
#[ derive( Clone , Debug ) ]
@@ -45,42 +45,103 @@ impl FileType {
45
45
}
46
46
47
47
/// Get the file type identifier.
48
+ ///
49
+ /// # Example
50
+ /// ```
51
+ /// use file_type::FileType;
52
+ ///
53
+ /// let file_type = FileType::from_id("fmt/11").expect("file type not found");
54
+ /// assert_eq!(file_type.id(), "fmt/11");
55
+ /// ```
48
56
#[ must_use]
49
57
pub fn id ( & self ) -> & str {
50
58
self . file_format . puid ( )
51
59
}
52
60
53
61
/// Get the human-readable name of the file type
62
+ ///
63
+ /// # Example
64
+ /// ```
65
+ /// use file_type::FileType;
66
+ ///
67
+ /// let file_type = FileType::from_id("fmt/11").expect("file type not found");
68
+ /// assert_eq!(file_type.name(), "Portable Network Graphics");
69
+ /// ```
54
70
#[ must_use]
55
71
pub fn name ( & self ) -> & str {
56
72
self . file_format . name ( )
57
73
}
58
74
59
- /// Get the [Media Type](https://www.rfc-editor.org/rfc/rfc2046.html)
60
- #[ must_use]
61
- pub fn media_types ( & self ) -> Vec < & str > {
62
- self . file_format . media_types ( )
63
- }
64
-
65
75
/// Get the file type extensions
76
+ ///
77
+ /// # Example
78
+ /// ```
79
+ /// use file_type::FileType;
80
+ ///
81
+ /// let file_type = FileType::from_id("fmt/11").expect("file type not found");
82
+ /// assert_eq!(file_type.extensions(), vec!["png"]);
83
+ /// ```
66
84
#[ must_use]
67
85
pub fn extensions ( & self ) -> Vec < & str > {
68
86
self . file_format . extensions ( )
69
87
}
70
88
71
- /// Get the file format
89
+ /// Get the [Media Type](https://www.rfc-editor.org/rfc/rfc2046.html)
90
+ ///
91
+ /// # Example
92
+ /// ```
93
+ /// use file_type::FileType;
94
+ ///
95
+ /// let file_type = FileType::from_id("fmt/11").expect("file type not found");
96
+ /// assert_eq!(file_type.media_types(), vec!["image/png"]);
97
+ /// ```
98
+ #[ must_use]
99
+ pub fn media_types ( & self ) -> Vec < & str > {
100
+ self . file_format . media_types ( )
101
+ }
102
+
103
+ /// Get the detailed file format information for this file type.
104
+ ///
105
+ /// # Example
106
+ /// ```
107
+ /// use file_type::FileType;
108
+ ///
109
+ /// let file_type = FileType::from_id("fmt/11").expect("file type not found");
110
+ /// assert_eq!(file_type.file_format().version(), "1.0");
111
+ /// ```
72
112
#[ must_use]
73
113
pub fn file_format ( & self ) -> & FileFormat {
74
114
& self . file_format
75
115
}
76
116
77
117
/// Get the file type for an identifier.
118
+ ///
119
+ /// # Example
120
+ /// ```
121
+ /// use file_type::FileType;
122
+ ///
123
+ /// let file_type = FileType::from_id("fmt/11").expect("file type not found");
124
+ /// assert_eq!(file_type.name(), "Portable Network Graphics");
125
+ /// assert_eq!(file_type.extensions(), vec!["png"]);
126
+ /// assert_eq!(file_type.media_types(), vec!["image/png"]);
127
+ /// ```
78
128
#[ must_use]
79
129
pub fn from_id < S : AsRef < str > > ( id : S ) -> Option < & ' static Self > {
80
130
file_types:: from_id ( id)
81
131
}
82
132
83
133
/// Get the file types for a given extension.
134
+ ///
135
+ /// # Example
136
+ /// ```
137
+ /// use file_type::FileType;
138
+ ///
139
+ /// let file_types = FileType::from_extension("md");
140
+ /// assert_eq!(1, file_types.len());
141
+ /// let file_type = file_types.first().expect("file format");
142
+ /// assert_eq!(file_type.name(), "Markdown");
143
+ /// assert_eq!(file_type.media_types(), vec!["text/markdown"]);
144
+ /// ```
84
145
#[ must_use]
85
146
pub fn from_extension < S : AsRef < str > > ( extension : S ) -> & ' static Vec < & ' static Self > {
86
147
file_types:: from_extension ( extension)
@@ -89,12 +150,33 @@ impl FileType {
89
150
const EMPTY_MEDIA_TYPES : Vec < & ' static FileType > = Vec :: new ( ) ;
90
151
91
152
/// Get the file types for a given media type.
153
+ ///
154
+ /// # Example
155
+ /// ```
156
+ /// use file_type::FileType;
157
+ ///
158
+ /// let file_types = FileType::from_media_type("text/markdown");
159
+ /// assert_eq!(1, file_types.len());
160
+ /// let file_type = file_types.first().expect("file format");
161
+ /// assert_eq!(file_type.name(), "Markdown");
162
+ /// assert_eq!(file_type.extensions(), vec!["md", "markdown"]);
163
+ /// ```
92
164
#[ must_use]
93
165
pub fn from_media_type < S : AsRef < str > > ( media_type : S ) -> & ' static Vec < & ' static Self > {
94
166
file_types:: from_media_type ( media_type)
95
167
}
96
168
97
169
/// Attempt to determine the `FileType` from a byte slice.
170
+ ///
171
+ /// # Example
172
+ /// ```
173
+ /// use file_type::FileType;
174
+ ///
175
+ /// let file_type = FileType::from_bytes(b"\xCA\xFE\xBA\xBE");
176
+ /// assert_eq!(file_type.name(), "Java Class File");
177
+ /// assert_eq!(file_type.media_types(), Vec::<String>::new());
178
+ /// assert_eq!(file_type.extensions(), vec!["class"]);
179
+ /// ```
98
180
pub fn from_bytes < B : AsRef < [ u8 ] > > ( bytes : B ) -> & ' static Self {
99
181
file_types:: from_bytes ( bytes, None )
100
182
}
@@ -103,9 +185,26 @@ impl FileType {
103
185
///
104
186
/// # Errors
105
187
/// if the file type is unknown
188
+ ///
189
+ /// # Example
190
+ /// ```
191
+ /// use file_type::FileType;
192
+ /// use tokio::io::BufReader;
193
+ ///
194
+ /// #[tokio::main]
195
+ /// async fn main() {
196
+ /// let bytes = b"\xCA\xFE\xBA\xBE";
197
+ /// let reader = BufReader::new(&bytes[..]);
198
+ /// let file_type = FileType::try_from_reader(reader).await.expect("file type not found");
199
+ /// assert_eq!(file_type.id(), "x-fmt/415");
200
+ /// assert_eq!(file_type.name(), "Java Class File");
201
+ /// assert_eq!(file_type.extensions(), vec!["class"]);
202
+ /// assert_eq!(file_type.media_types(), Vec::<String>::new());
203
+ /// }
204
+ /// ```
106
205
pub async fn try_from_reader < R > ( reader : R ) -> Result < & ' static Self >
107
206
where
108
- R : AsyncRead + AsyncSeek + Unpin ,
207
+ R : AsyncRead + Unpin ,
109
208
{
110
209
file_types:: try_from_reader ( reader, None ) . await
111
210
}
@@ -114,6 +213,22 @@ impl FileType {
114
213
///
115
214
/// # Errors
116
215
/// if the file type is unknown
216
+ ///
217
+ /// # Example
218
+ /// ```no_run
219
+ /// use file_type::FileType;
220
+ /// use std::path::Path;
221
+ ///
222
+ /// #[tokio::main]
223
+ /// async fn main() {
224
+ /// let file_path = Path::new("image.png");
225
+ /// let file_type = FileType::try_from_file(file_path).await.expect("file type not found");
226
+ /// assert_eq!(file_type.id(), "fmt/11");
227
+ /// assert_eq!(file_type.name(), "Portable Network Graphics");
228
+ /// assert_eq!(file_type.extensions(), vec!["png"]);
229
+ /// assert_eq!(file_type.media_types(), vec!["image/png"]);
230
+ /// }
231
+ /// ```
117
232
pub async fn try_from_file < P : AsRef < Path > > ( path : P ) -> Result < & ' static Self > {
118
233
file_types:: try_from_file ( path) . await
119
234
}
@@ -122,14 +237,41 @@ impl FileType {
122
237
///
123
238
/// # Errors
124
239
/// if the file type is unknown
125
- pub fn try_from_reader_sync < R : Read + Seek > ( reader : R ) -> Result < & ' static Self > {
240
+ ///
241
+ /// # Example
242
+ /// ```
243
+ /// use file_type::FileType;
244
+ /// use std::io::BufReader;
245
+ ///
246
+ /// let bytes = b"\xCA\xFE\xBA\xBE";
247
+ /// let reader = BufReader::new(&bytes[..]);
248
+ /// let file_type = FileType::try_from_reader_sync(reader).expect("file type not found");
249
+ /// assert_eq!(file_type.id(), "x-fmt/415");
250
+ /// assert_eq!(file_type.name(), "Java Class File");
251
+ /// assert_eq!(file_type.extensions(), vec!["class"]);
252
+ /// assert_eq!(file_type.media_types(), Vec::<String>::new());
253
+ /// ```
254
+ pub fn try_from_reader_sync < R : Read > ( reader : R ) -> Result < & ' static Self > {
126
255
file_types:: try_from_reader_sync ( reader, None )
127
256
}
128
257
129
258
/// Attempt to determine the `FileType` from a file synchronously.
130
259
///
131
260
/// # Errors
132
261
/// if the file type is unknown
262
+ ///
263
+ /// # Example
264
+ /// ```no_run
265
+ /// use file_type::FileType;
266
+ /// use std::path::Path;
267
+ ///
268
+ /// let file_path = Path::new("image.png");
269
+ /// let file_type = FileType::try_from_file_sync(file_path).expect("file type not found");
270
+ /// assert_eq!(file_type.id(), "fmt/11");
271
+ /// assert_eq!(file_type.name(), "Portable Network Graphics");
272
+ /// assert_eq!(file_type.extensions(), vec!["png"]);
273
+ /// assert_eq!(file_type.media_types(), vec!["image/png"]);
274
+ /// ```
133
275
pub fn try_from_file_sync < P : AsRef < Path > > ( path : P ) -> Result < & ' static Self > {
134
276
file_types:: try_from_file_sync ( path)
135
277
}
@@ -153,8 +295,8 @@ mod tests {
153
295
let file_type = FileType :: from_id ( "fmt/11" ) . expect ( "file type not found" ) ;
154
296
assert_eq ! ( file_type. id( ) , "fmt/11" ) ;
155
297
assert_eq ! ( file_type. name( ) , "Portable Network Graphics" ) ;
156
- assert_eq ! ( file_type. media_types ( ) , vec![ "image/ png" . to_string ( ) ] ) ;
157
- assert_eq ! ( file_type. extensions ( ) , vec![ "png" . to_string ( ) ] ) ;
298
+ assert_eq ! ( file_type. extensions ( ) , vec![ "png" ] ) ;
299
+ assert_eq ! ( file_type. media_types ( ) , vec![ "image/ png" ] ) ;
158
300
assert_eq ! ( file_type. file_format( ) . id( ) , 664 ) ;
159
301
}
160
302
@@ -170,8 +312,8 @@ mod tests {
170
312
assert_eq ! ( 1 , file_types. len( ) ) ;
171
313
let file_type = file_types. first ( ) . expect ( "file format" ) ;
172
314
assert_eq ! ( file_type. id( ) , "fmt/1149" ) ;
173
- assert_eq ! ( file_type. media_types( ) , vec![ "text/markdown" . to_string( ) ] ) ;
174
315
assert_eq ! ( file_type. name( ) , "Markdown" ) ;
316
+ assert_eq ! ( file_type. media_types( ) , vec![ "text/markdown" ] ) ;
175
317
}
176
318
177
319
#[ test]
@@ -186,11 +328,8 @@ mod tests {
186
328
assert_eq ! ( 1 , file_types. len( ) ) ;
187
329
let file_type = file_types. first ( ) . expect ( "file format" ) ;
188
330
assert_eq ! ( file_type. id( ) , "fmt/1149" ) ;
189
- assert_eq ! (
190
- file_type. extensions( ) ,
191
- vec![ "md" . to_string( ) , "markdown" . to_string( ) ]
192
- ) ;
193
331
assert_eq ! ( file_type. name( ) , "Markdown" ) ;
332
+ assert_eq ! ( file_type. extensions( ) , vec![ "md" , "markdown" ] ) ;
194
333
}
195
334
196
335
#[ test]
@@ -205,20 +344,19 @@ mod tests {
205
344
let file_type = FileType :: from_bytes ( value. as_slice ( ) ) ;
206
345
assert_eq ! ( file_type. id( ) , "default/1" ) ;
207
346
assert_eq ! ( file_type. name( ) , "Text" ) ;
208
- assert_eq ! ( file_type. media_types( ) , vec![ "text/plain" . to_string( ) ] ) ;
209
347
assert_eq ! ( file_type. extensions( ) , Vec :: <String >:: new( ) ) ;
348
+ assert_eq ! ( file_type. media_types( ) , vec![ "text/plain" ] ) ;
210
349
}
211
350
212
351
#[ tokio:: test]
213
352
async fn test_try_from_reader ( ) -> Result < ( ) > {
214
- let file_path = test_file_path ( ) ;
215
- let file = tokio:: fs:: File :: open ( file_path) . await ?;
216
- let reader = tokio:: io:: BufReader :: new ( file) ;
353
+ let bytes = b"\xCA \xFE \xBA \xBE " ;
354
+ let reader = tokio:: io:: BufReader :: new ( & bytes[ ..] ) ;
217
355
let file_type = FileType :: try_from_reader ( reader) . await ?;
218
- assert_eq ! ( file_type. id( ) , "fmt/11 " ) ;
219
- assert_eq ! ( file_type. name( ) , "Portable Network Graphics " ) ;
220
- assert_eq ! ( file_type. media_types ( ) , vec![ "image/png" . to_string ( ) ] ) ;
221
- assert_eq ! ( file_type. extensions ( ) , vec! [ "png" . to_string ( ) ] ) ;
356
+ assert_eq ! ( file_type. id( ) , "x- fmt/415 " ) ;
357
+ assert_eq ! ( file_type. name( ) , "Java Class File " ) ;
358
+ assert_eq ! ( file_type. extensions ( ) , vec![ "class" ] ) ;
359
+ assert_eq ! ( file_type. media_types ( ) , Vec :: < String > :: new ( ) ) ;
222
360
Ok ( ( ) )
223
361
}
224
362
@@ -228,21 +366,20 @@ mod tests {
228
366
let file_type = FileType :: try_from_file ( file_path) . await ?;
229
367
assert_eq ! ( file_type. id( ) , "fmt/11" ) ;
230
368
assert_eq ! ( file_type. name( ) , "Portable Network Graphics" ) ;
231
- assert_eq ! ( file_type. media_types ( ) , vec![ "image/ png" . to_string ( ) ] ) ;
232
- assert_eq ! ( file_type. extensions ( ) , vec![ "png" . to_string ( ) ] ) ;
369
+ assert_eq ! ( file_type. extensions ( ) , vec![ "png" ] ) ;
370
+ assert_eq ! ( file_type. media_types ( ) , vec![ "image/ png" ] ) ;
233
371
Ok ( ( ) )
234
372
}
235
373
236
374
#[ test]
237
375
fn test_try_from_reader_sync ( ) -> Result < ( ) > {
238
- let file_path = test_file_path ( ) ;
239
- let file = std:: fs:: File :: open ( file_path) ?;
240
- let reader = std:: io:: BufReader :: new ( file) ;
376
+ let bytes = b"\xCA \xFE \xBA \xBE " ;
377
+ let reader = std:: io:: BufReader :: new ( & bytes[ ..] ) ;
241
378
let file_type = FileType :: try_from_reader_sync ( reader) ?;
242
- assert_eq ! ( file_type. id( ) , "fmt/11 " ) ;
243
- assert_eq ! ( file_type. name( ) , "Portable Network Graphics " ) ;
244
- assert_eq ! ( file_type. media_types ( ) , vec![ "image/png" . to_string ( ) ] ) ;
245
- assert_eq ! ( file_type. extensions ( ) , vec! [ "png" . to_string ( ) ] ) ;
379
+ assert_eq ! ( file_type. id( ) , "x- fmt/415 " ) ;
380
+ assert_eq ! ( file_type. name( ) , "Java Class File " ) ;
381
+ assert_eq ! ( file_type. extensions ( ) , vec![ "class" ] ) ;
382
+ assert_eq ! ( file_type. media_types ( ) , Vec :: < String > :: new ( ) ) ;
246
383
Ok ( ( ) )
247
384
}
248
385
@@ -252,8 +389,8 @@ mod tests {
252
389
let file_type = FileType :: try_from_file_sync ( file_path) ?;
253
390
assert_eq ! ( file_type. id( ) , "fmt/11" ) ;
254
391
assert_eq ! ( file_type. name( ) , "Portable Network Graphics" ) ;
255
- assert_eq ! ( file_type. media_types ( ) , vec![ "image/ png" . to_string ( ) ] ) ;
256
- assert_eq ! ( file_type. extensions ( ) , vec![ "png" . to_string ( ) ] ) ;
392
+ assert_eq ! ( file_type. extensions ( ) , vec![ "png" ] ) ;
393
+ assert_eq ! ( file_type. media_types ( ) , vec![ "image/ png" ] ) ;
257
394
Ok ( ( ) )
258
395
}
259
396
}
0 commit comments