Skip to content

Commit 5587697

Browse files
committed
docs: update documentation
1 parent f37da2d commit 5587697

File tree

12 files changed

+206
-68
lines changed

12 files changed

+206
-68
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
File Type is a library that uses file signatures and file extensions to determine the type of file.
1212

13-
Signatures, extensions and media type data are provided by:
13+
Signature, extension and media type data are provided by:
1414
* [The National Archives PRONOM](https://www.nationalarchives.gov.uk/pronom/)
1515
* [Apache HTTPD](https://github.com/apache/httpd/blob/trunk/docs/conf/mime.types)
1616
* [Linguist](https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml)

file_type/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
A file type. The file type is determined by examining the file or bytes against known file
1414
signatures and file extensions.
1515

16-
Signatures, extensions and media type data are provided by:
16+
Signature, extension and media type data are provided by:
1717
* [The National Archives PRONOM](https://www.nationalarchives.gov.uk/pronom/)
1818
* [Apache HTTPD](https://github.com/apache/httpd/blob/trunk/docs/conf/mime.types)
1919
* [Linguist](https://github.com/github-linguist/linguist/blob/main/lib/linguist/languages.yml)

file_type/src/file_type.rs

Lines changed: 174 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ use tokio::runtime::Builder;
2121
/// let file_type = FileType::from_bytes(b"\xCA\xFE\xBA\xBE");
2222
/// assert_eq!(file_type.name(), "Java Class File");
2323
/// 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"]);
2525
/// ```
2626
///
2727
/// Detect text from bytes:
@@ -30,7 +30,7 @@ use tokio::runtime::Builder;
3030
///
3131
/// let file_type = FileType::from_bytes(b"hello, world\n");
3232
/// 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"]);
3434
/// assert_eq!(file_type.extensions(), Vec::<String>::new());
3535
/// ```
3636
#[derive(Clone, Debug)]
@@ -45,42 +45,103 @@ impl FileType {
4545
}
4646

4747
/// 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+
/// ```
4856
#[must_use]
4957
pub fn id(&self) -> &str {
5058
self.file_format.puid()
5159
}
5260

5361
/// 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+
/// ```
5470
#[must_use]
5571
pub fn name(&self) -> &str {
5672
self.file_format.name()
5773
}
5874

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-
6575
/// 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+
/// ```
6684
#[must_use]
6785
pub fn extensions(&self) -> Vec<&str> {
6886
self.file_format.extensions()
6987
}
7088

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+
/// ```
72112
#[must_use]
73113
pub fn file_format(&self) -> &FileFormat {
74114
&self.file_format
75115
}
76116

77117
/// 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+
/// ```
78128
#[must_use]
79129
pub fn from_id<S: AsRef<str>>(id: S) -> Option<&'static Self> {
80130
file_types::from_id(id)
81131
}
82132

83133
/// 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+
/// ```
84145
#[must_use]
85146
pub fn from_extension<S: AsRef<str>>(extension: S) -> &'static Vec<&'static Self> {
86147
file_types::from_extension(extension)
@@ -89,12 +150,33 @@ impl FileType {
89150
const EMPTY_MEDIA_TYPES: Vec<&'static FileType> = Vec::new();
90151

91152
/// 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+
/// ```
92164
#[must_use]
93165
pub fn from_media_type<S: AsRef<str>>(media_type: S) -> &'static Vec<&'static Self> {
94166
file_types::from_media_type(media_type)
95167
}
96168

97169
/// 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+
/// ```
98180
pub fn from_bytes<B: AsRef<[u8]>>(bytes: B) -> &'static Self {
99181
file_types::from_bytes(bytes, None)
100182
}
@@ -103,9 +185,26 @@ impl FileType {
103185
///
104186
/// # Errors
105187
/// 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+
/// ```
106205
pub async fn try_from_reader<R>(reader: R) -> Result<&'static Self>
107206
where
108-
R: AsyncRead + AsyncSeek + Unpin,
207+
R: AsyncRead + Unpin,
109208
{
110209
file_types::try_from_reader(reader, None).await
111210
}
@@ -114,6 +213,22 @@ impl FileType {
114213
///
115214
/// # Errors
116215
/// 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+
/// ```
117232
pub async fn try_from_file<P: AsRef<Path>>(path: P) -> Result<&'static Self> {
118233
file_types::try_from_file(path).await
119234
}
@@ -122,14 +237,41 @@ impl FileType {
122237
///
123238
/// # Errors
124239
/// 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> {
126255
file_types::try_from_reader_sync(reader, None)
127256
}
128257

129258
/// Attempt to determine the `FileType` from a file synchronously.
130259
///
131260
/// # Errors
132261
/// 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+
/// ```
133275
pub fn try_from_file_sync<P: AsRef<Path>>(path: P) -> Result<&'static Self> {
134276
file_types::try_from_file_sync(path)
135277
}
@@ -153,8 +295,8 @@ mod tests {
153295
let file_type = FileType::from_id("fmt/11").expect("file type not found");
154296
assert_eq!(file_type.id(), "fmt/11");
155297
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"]);
158300
assert_eq!(file_type.file_format().id(), 664);
159301
}
160302

@@ -170,8 +312,8 @@ mod tests {
170312
assert_eq!(1, file_types.len());
171313
let file_type = file_types.first().expect("file format");
172314
assert_eq!(file_type.id(), "fmt/1149");
173-
assert_eq!(file_type.media_types(), vec!["text/markdown".to_string()]);
174315
assert_eq!(file_type.name(), "Markdown");
316+
assert_eq!(file_type.media_types(), vec!["text/markdown"]);
175317
}
176318

177319
#[test]
@@ -186,11 +328,8 @@ mod tests {
186328
assert_eq!(1, file_types.len());
187329
let file_type = file_types.first().expect("file format");
188330
assert_eq!(file_type.id(), "fmt/1149");
189-
assert_eq!(
190-
file_type.extensions(),
191-
vec!["md".to_string(), "markdown".to_string()]
192-
);
193331
assert_eq!(file_type.name(), "Markdown");
332+
assert_eq!(file_type.extensions(), vec!["md", "markdown"]);
194333
}
195334

196335
#[test]
@@ -205,20 +344,19 @@ mod tests {
205344
let file_type = FileType::from_bytes(value.as_slice());
206345
assert_eq!(file_type.id(), "default/1");
207346
assert_eq!(file_type.name(), "Text");
208-
assert_eq!(file_type.media_types(), vec!["text/plain".to_string()]);
209347
assert_eq!(file_type.extensions(), Vec::<String>::new());
348+
assert_eq!(file_type.media_types(), vec!["text/plain"]);
210349
}
211350

212351
#[tokio::test]
213352
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[..]);
217355
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());
222360
Ok(())
223361
}
224362

@@ -228,21 +366,20 @@ mod tests {
228366
let file_type = FileType::try_from_file(file_path).await?;
229367
assert_eq!(file_type.id(), "fmt/11");
230368
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"]);
233371
Ok(())
234372
}
235373

236374
#[test]
237375
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[..]);
241378
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());
246383
Ok(())
247384
}
248385

@@ -252,8 +389,8 @@ mod tests {
252389
let file_type = FileType::try_from_file_sync(file_path)?;
253390
assert_eq!(file_type.id(), "fmt/11");
254391
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"]);
257394
Ok(())
258395
}
259396
}

0 commit comments

Comments
 (0)