tft/
lib.rs

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}