Skip to main content

selection_capture/
platform.rs

1use crate::types::CaptureMethod;
2
3#[derive(Clone, Copy, Debug, PartialEq, Eq)]
4pub struct PlatformCapabilities {
5    supported: [bool; 4],
6}
7
8impl PlatformCapabilities {
9    pub fn new(supported: &[CaptureMethod]) -> Self {
10        let mut capabilities = [false; 4];
11        for &method in supported {
12            capabilities[method_index(method)] = true;
13        }
14        Self {
15            supported: capabilities,
16        }
17    }
18
19    pub fn supports(&self, method: CaptureMethod) -> bool {
20        self.supported[method_index(method)]
21    }
22}
23
24const fn method_index(method: CaptureMethod) -> usize {
25    match method {
26        CaptureMethod::AccessibilityPrimary => 0,
27        CaptureMethod::AccessibilityRange => 1,
28        CaptureMethod::ClipboardBorrow => 2,
29        CaptureMethod::SyntheticCopy => 3,
30    }
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn supports_returns_true_for_enabled_methods() {
39        let capabilities = PlatformCapabilities::new(&[
40            CaptureMethod::AccessibilityPrimary,
41            CaptureMethod::ClipboardBorrow,
42        ]);
43
44        assert!(capabilities.supports(CaptureMethod::AccessibilityPrimary));
45        assert!(capabilities.supports(CaptureMethod::ClipboardBorrow));
46    }
47
48    #[test]
49    fn supports_returns_false_for_disabled_methods() {
50        let capabilities = PlatformCapabilities::new(&[
51            CaptureMethod::AccessibilityPrimary,
52            CaptureMethod::ClipboardBorrow,
53        ]);
54
55        assert!(!capabilities.supports(CaptureMethod::AccessibilityRange));
56        assert!(!capabilities.supports(CaptureMethod::SyntheticCopy));
57    }
58}