use std::sync::{Arc, Mutex};
use auv_driver_common::error::DriverResult;
use crate::driver::LinuxDriverSessionState;
use crate::native::portal::{ClipboardSession, PortalClipboard};
pub fn snapshot(state: &Arc<Mutex<LinuxDriverSessionState>>) -> DriverResult<String> {
with_clipboard_session(state, |session| session.snapshot())
}
pub fn restore(state: &Arc<Mutex<LinuxDriverSessionState>>, snapshot: &str) -> DriverResult<()> {
with_clipboard_session(state, |session| session.set_text(snapshot))
}
pub fn set_text(state: &Arc<Mutex<LinuxDriverSessionState>>, text: &str) -> DriverResult<()> {
with_clipboard_session(state, |session| session.set_text(text))
}
fn with_clipboard_session<T>(
state: &Arc<Mutex<LinuxDriverSessionState>>,
operation: impl FnOnce(&mut ClipboardSession) -> DriverResult<T>,
) -> DriverResult<T> {
let mut state = state.lock().expect("linux driver session state poisoned");
if state.clipboard_session.is_none() {
state.clipboard_session = Some(PortalClipboard::open(state.portal_app_id.as_ref())?);
}
operation(state.clipboard_session.as_mut().expect("clipboard session was just initialized"))
}