1#[cfg(all(
2 unix,
3 not(any(
4 target_os = "macos",
5 target_os = "ios",
6 target_os = "android",
7 target_os = "emscripten",
8 target_os = "redox"
9 ))
10))]
11#[path = "platform/linux.rs"]
12mod platform;
13
14#[cfg(target_os = "windows")]
15#[path = "platform/windows.rs"]
16mod platform;
17
18#[cfg(target_os = "macos")]
19#[path = "platform/macos.rs"]
20mod platform;
21
22#[cfg(target_os = "ios")]
23#[path = "platform/ios.rs"]
24mod platform;
25
26#[cfg(target_os = "android")]
27#[path = "platform/android.rs"]
28mod platform;
29
30#[cfg(not(any(
31 all(
32 unix,
33 not(any(
34 target_os = "macos",
35 target_os = "ios",
36 target_os = "android",
37 target_os = "emscripten",
38 target_os = "redox"
39 ))
40 ),
41 target_os = "windows",
42 target_os = "macos",
43 target_os = "ios",
44 target_os = "android"
45)))]
46#[path = "platform/dummy.rs"]
47mod platform;
48
49use raw_window_handle::HasDisplayHandle;
50use std::error::Error;
51
52pub struct Clipboard {
53 raw: Box<dyn ClipboardProvider>,
54}
55
56impl Clipboard {
57 pub unsafe fn connect<W: HasDisplayHandle>(
59 window: &W,
60 ) -> Result<Self, Box<dyn Error>> {
61 let raw = platform::connect(window)?;
62
63 Ok(Clipboard { raw })
64 }
65
66 pub fn read(&self) -> Result<String, Box<dyn Error>> {
67 self.raw.read()
68 }
69
70 pub fn write(&mut self, contents: String) -> Result<(), Box<dyn Error>> {
71 self.raw.write(contents)
72 }
73}
74
75impl Clipboard {
76 pub fn read_primary(&self) -> Option<Result<String, Box<dyn Error>>> {
77 self.raw.read_primary()
78 }
79
80 pub fn write_primary(&mut self, contents: String) -> Option<Result<(), Box<dyn Error>>> {
81 self.raw.write_primary(contents)
82 }
83}
84
85pub trait ClipboardProvider {
86 fn read(&self) -> Result<String, Box<dyn Error>>;
87
88 fn write(&mut self, contents: String) -> Result<(), Box<dyn Error>>;
89
90 fn read_primary(&self) -> Option<Result<String, Box<dyn Error>>> {
91 None
92 }
93
94 fn write_primary(&mut self, _contents: String) -> Option<Result<(), Box<dyn Error>>> {
95 None
96 }
97}