Skip to main content

batty_cli/
paths.rs

1#![cfg_attr(not(test), allow(dead_code))]
2
3use std::path::{Path, PathBuf};
4
5/// Resolve the kanban root directory for a project.
6///
7/// Prefers `.batty/kanban/` (new layout) if it exists, otherwise falls back
8/// to `kanban/` (legacy layout). When neither exists, returns the preferred
9/// `.batty/kanban/` path so new projects get the consolidated layout.
10pub fn resolve_kanban_root(base: &Path) -> PathBuf {
11    let preferred = base.join(".batty").join("kanban");
12    if preferred.is_dir() {
13        preferred
14    } else {
15        let legacy = base.join("kanban");
16        if legacy.is_dir() { legacy } else { preferred }
17    }
18}
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23
24    #[test]
25    fn prefers_batty_kanban_when_it_exists() {
26        let tmp = tempfile::tempdir().unwrap();
27        std::fs::create_dir_all(tmp.path().join(".batty").join("kanban")).unwrap();
28        std::fs::create_dir_all(tmp.path().join("kanban")).unwrap();
29
30        let result = resolve_kanban_root(tmp.path());
31        assert_eq!(result, tmp.path().join(".batty").join("kanban"));
32    }
33
34    #[test]
35    fn falls_back_to_legacy_kanban() {
36        let tmp = tempfile::tempdir().unwrap();
37        std::fs::create_dir_all(tmp.path().join("kanban")).unwrap();
38
39        let result = resolve_kanban_root(tmp.path());
40        assert_eq!(result, tmp.path().join("kanban"));
41    }
42
43    #[test]
44    fn returns_preferred_when_neither_exists() {
45        let tmp = tempfile::tempdir().unwrap();
46
47        let result = resolve_kanban_root(tmp.path());
48        assert_eq!(result, tmp.path().join(".batty").join("kanban"));
49    }
50}