use { crate::{ copy_device::{CopyDevice, CopyDeviceRegistry}, utils::errorfmt::ErrorFmt, }, std::{ cell::OnceCell, fmt::{Debug, Formatter}, rc::Rc, }, uapi::c::dev_t, }; pub struct CopyDeviceHolder { pub registry: Rc, pub devnum: dev_t, pub dev: OnceCell>>, } impl Debug for CopyDeviceHolder { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.debug_struct("CopyDeviceHolder").finish_non_exhaustive() } } impl CopyDeviceHolder { pub fn get(&self) -> Option> { self.dev .get_or_init( || match self.registry.get(self.devnum)?.create_device().map(Some) { Ok(d) => d, Err(e) => { log::error!( "Could not get copy device for {}: {}", self.devnum, ErrorFmt(e), ); None } }, ) .clone() } }