angsd_saf/
ext.rs

1//! SAF file name extensions.
2
3/// Conventional index file extension.
4pub const INDEX_EXT: &str = "saf.idx";
5
6/// Conventional positions file extension.
7pub const POSITIONS_FILE_EXT: &str = "saf.pos.gz";
8
9/// Conventional item file extension.
10pub const ITEM_FILE_EXT: &str = "saf.gz";
11
12const EXTS: [&str; 3] = [INDEX_EXT, POSITIONS_FILE_EXT, ITEM_FILE_EXT];
13
14/// Returns the shared prefix of SAF file member paths given any one of them.
15pub(crate) fn prefix_from_member_path(s: &str) -> Option<&str> {
16    EXTS.into_iter()
17        .find(|ext| s.ends_with(ext))
18        .and_then(|ext| s.strip_suffix(ext))
19        .and_then(|s_stem| s_stem.strip_suffix('.'))
20}
21
22/// Returns the all three SAF file member paths given their shared prefix.
23pub(crate) fn member_paths_from_prefix(prefix: &str) -> [String; 3] {
24    let create_path = |ext| format!("{prefix}.{ext}");
25    let index_path = create_path(INDEX_EXT);
26    let position_path = create_path(POSITIONS_FILE_EXT);
27    let item_path = create_path(ITEM_FILE_EXT);
28
29    [index_path, position_path, item_path]
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn test_prefix_from_member_path() {
38        assert_eq!(prefix_from_member_path("foo.saf.idx"), Some("foo"));
39        assert_eq!(prefix_from_member_path("foo.bar.saf.idx"), Some("foo.bar"));
40        assert_eq!(
41            prefix_from_member_path("dir/bar.saf.pos.gz"),
42            Some("dir/bar")
43        );
44        assert_eq!(
45            prefix_from_member_path("/home/dir/baz.saf.gz"),
46            Some("/home/dir/baz"),
47        );
48    }
49
50    #[test]
51    fn test_prefix_from_non_member_path_invalid() {
52        assert_eq!(prefix_from_member_path("foo.saf.gz.idx"), None);
53    }
54
55    #[test]
56    fn test_member_paths_from_prefix() {
57        let [index_path, position_path, item_path] = member_paths_from_prefix("foo");
58        assert_eq!(index_path, "foo.saf.idx");
59        assert_eq!(position_path, "foo.saf.pos.gz");
60        assert_eq!(item_path, "foo.saf.gz");
61    }
62
63    #[test]
64    fn test_member_paths_from_prefix_with_extra_prefix() {
65        let [index_path, position_path, item_path] = member_paths_from_prefix("foo.bar");
66        assert_eq!(index_path, "foo.bar.saf.idx");
67        assert_eq!(position_path, "foo.bar.saf.pos.gz");
68        assert_eq!(item_path, "foo.bar.saf.gz");
69    }
70}