Skip to main content

telar_services_core/
paths.rs

1use std::path::PathBuf;
2
3pub trait AppPathsProvider: Send + Sync {
4    fn config_dir(&self) -> Option<PathBuf>;
5    fn data_dir(&self) -> Option<PathBuf>;
6    fn cache_dir(&self) -> Option<PathBuf>;
7
8    /// OS system-font directory to scan for fallback family resolution. `None` on platforms where the
9    /// renderer's default font discovery suffices (desktop); the platform adapter overrides it where the OS
10    /// keeps fonts in a fixed location (Android → `/system/fonts`).
11    fn system_fonts_dir(&self) -> Option<PathBuf> {
12        None
13    }
14    /// Sans-serif family names to try in priority order, OS/OEM-specific. Empty when default discovery
15    /// suffices; the platform adapter overrides it (Android OEM font stacks).
16    fn sans_serif_candidates(&self) -> Vec<String> {
17        Vec::new()
18    }
19}
20
21#[cfg(test)]
22mod tests {
23    use super::*;
24
25    struct MockPathsProvider {
26        config: PathBuf,
27        data: PathBuf,
28        cache: PathBuf,
29    }
30
31    impl AppPathsProvider for MockPathsProvider {
32        fn config_dir(&self) -> Option<PathBuf> {
33            Some(self.config.clone())
34        }
35
36        fn data_dir(&self) -> Option<PathBuf> {
37            Some(self.data.clone())
38        }
39
40        fn cache_dir(&self) -> Option<PathBuf> {
41            Some(self.cache.clone())
42        }
43    }
44
45    #[test]
46    fn test_mock_provider_config_dir() {
47        let provider = MockPathsProvider {
48            config: PathBuf::from("/mock/config"),
49            data: PathBuf::from("/mock/data"),
50            cache: PathBuf::from("/mock/cache"),
51        };
52
53        assert_eq!(provider.config_dir(), Some(PathBuf::from("/mock/config")));
54    }
55
56    #[test]
57    fn test_mock_provider_data_dir() {
58        let provider = MockPathsProvider {
59            config: PathBuf::from("/mock/config"),
60            data: PathBuf::from("/mock/data"),
61            cache: PathBuf::from("/mock/cache"),
62        };
63
64        assert_eq!(provider.data_dir(), Some(PathBuf::from("/mock/data")));
65    }
66
67    #[test]
68    fn test_mock_provider_cache_dir() {
69        let provider = MockPathsProvider {
70            config: PathBuf::from("/mock/config"),
71            data: PathBuf::from("/mock/data"),
72            cache: PathBuf::from("/mock/cache"),
73        };
74
75        assert_eq!(provider.cache_dir(), Some(PathBuf::from("/mock/cache")));
76    }
77
78    struct NonePathsProvider;
79
80    impl AppPathsProvider for NonePathsProvider {
81        fn config_dir(&self) -> Option<PathBuf> {
82            None
83        }
84
85        fn data_dir(&self) -> Option<PathBuf> {
86            None
87        }
88
89        fn cache_dir(&self) -> Option<PathBuf> {
90            None
91        }
92    }
93
94    #[test]
95    fn test_none_provider_handles_missing_paths() {
96        let provider = NonePathsProvider;
97
98        assert_eq!(provider.config_dir(), None);
99        assert_eq!(provider.data_dir(), None);
100        assert_eq!(provider.cache_dir(), None);
101    }
102}