1#![doc = include_str!("../README.md")]
2#![cfg_attr(
3 feature = "docs",
4 cfg_attr(doc, doc = ::document_features::document_features!(feature_label = r#"<span class="stab portability"><code>{feature}</code></span>"#))
5)]
6#![cfg_attr(all(doc, CHANNEL_NIGHTLY), feature(doc_auto_cfg))]
7#![warn(rust_2018_idioms)]
8#![deny(missing_docs)]
9
10#[cfg(feature = "detect")]
11use std::path::Path;
12
13#[cfg(feature = "detect")]
14pub use detect::*;
15pub use list::FileType;
16
17#[cfg(feature = "detect")]
18mod detect;
19mod list;
20
21#[derive(Clone)]
22#[cfg(feature = "detect")]
23enum FileTypeResolver {
24 Static(FileType),
25 Dynamic(fn(&Path, &str) -> Option<FileType>),
26}
27
28#[cfg(feature = "detect")]
29impl FileTypeResolver {
30 fn resolve(&self, path: &Path, content: &str) -> Option<FileType> {
31 match self {
32 FileTypeResolver::Static(ft) => Some(*ft),
33 FileTypeResolver::Dynamic(func) => func(path, content),
34 }
35 }
36}
37
38#[cfg(all(test, feature = "detect"))]
39mod tests {
40 use super::*;
41
42 #[test]
43 fn paths() {
44 assert_eq!(FileType::Zsh, detect(Path::new("/etc/zprofile"), ""));
45 assert_eq!(FileType::Toml, detect(Path::new(".cargo/config"), ""));
46 }
47
48 #[test]
49 fn filenames() {
50 assert_eq!(FileType::Json, detect(Path::new(".prettierrc"), ""));
51 assert_eq!(FileType::CMake, detect(Path::new("CMakeLists.txt"), ""));
52 }
53
54 #[test]
55 fn patterns() {
56 assert_eq!(FileType::Scheme, detect(Path::new("highlights.scm"), ""));
57 assert_eq!(
58 FileType::TreeSitterQuery,
59 detect(Path::new("a/b/c/queries/highlights.scm"), "")
60 );
61 }
62}