Skip to main content

yozuk_helper_filetype/
lib.rs

1use chardetng::EncodingDetector;
2use file_format::FileFormat;
3use mediatype::{media_type, MediaTypeBuf};
4
5pub fn is_utf8_text<T>(data: T) -> bool
6where
7    T: AsRef<[u8]>,
8{
9    let mut detector = EncodingDetector::new();
10    detector.feed(data.as_ref(), true);
11    detector.guess(None, true) == encoding_rs::UTF_8
12}
13
14pub fn guess_media_type<T>(data: T) -> MediaTypeBuf
15where
16    T: AsRef<[u8]>,
17{
18    let format = FileFormat::from_bytes(data.as_ref());
19    match format {
20        FileFormat::ArbitraryBinaryData if is_utf8_text(data) => media_type!(TEXT / PLAIN).into(),
21        FileFormat::ArbitraryBinaryData => media_type!(APPLICATION / OCTET_STREAM).into(),
22        _ => format.media_type().parse().unwrap(),
23    }
24}
25
26pub fn get_file_extension<T>(media_type: T) -> &'static str
27where
28    T: AsRef<str>,
29{
30    mime2ext::mime2ext(media_type).unwrap_or("bin")
31}