1pub const INDEX_EXT: &str = "saf.idx";
5
6pub const POSITIONS_FILE_EXT: &str = "saf.pos.gz";
8
9pub const ITEM_FILE_EXT: &str = "saf.gz";
11
12const EXTS: [&str; 3] = [INDEX_EXT, POSITIONS_FILE_EXT, ITEM_FILE_EXT];
13
14pub(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
22pub(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}