pub struct DirectoryImporter;
impl crate::Importer for DirectoryImporter {
#[inline]
fn name(&self) -> String {
"rerun.importers.Directory".into()
}
#[cfg(not(target_arch = "wasm32"))]
fn import_from_path(
&self,
settings: &crate::ImporterSettings,
dirpath: std::path::PathBuf,
tx: crossbeam::channel::Sender<crate::ImportedData>,
) -> Result<(), crate::ImporterError> {
if !dirpath.is_dir() {
return Err(crate::ImporterError::Incompatible(dirpath.clone()));
}
if crate::lerobot::is_lerobot_dataset(&dirpath) {
return Err(crate::ImporterError::Incompatible(dirpath.clone()));
}
re_tracing::profile_function!(dirpath.display().to_string());
re_log::debug!(?dirpath, importer = self.name(), "Loading directory…",);
for entry in walkdir::WalkDir::new(&dirpath) {
let entry = match entry {
Ok(entry) => entry,
Err(err) => {
re_log::error!(importer = self.name(), ?dirpath, %err, "Failed to open filesystem entry");
continue;
}
};
let filepath = entry.path();
if filepath.is_file() {
let settings = settings.clone();
let filepath = filepath.to_owned();
let tx = tx.clone();
_ = std::thread::Builder::new()
.name(format!("load_dir_entry({filepath:?})"))
.spawn(move || {
let data = match crate::import_file::import(&settings, &filepath, None) {
Ok(data) => data,
Err(err) => {
re_log::error!(?filepath, %err, "Failed to load directory entry");
return;
}
};
for datum in data {
if re_quota_channel::send_crossbeam(&tx, datum).is_err() {
break;
}
}
});
}
}
Ok(())
}
#[inline]
fn import_from_file_contents(
&self,
_settings: &crate::ImporterSettings,
path: std::path::PathBuf,
_contents: std::borrow::Cow<'_, [u8]>,
_tx: crossbeam::channel::Sender<crate::ImportedData>,
) -> Result<(), crate::ImporterError> {
Err(crate::ImporterError::Incompatible(path))
}
}