gphoto2 3.4.1

High-level wrapper for libgphoto2
Documentation
use gphoto2::{filesys::CameraFS, Context, Result};
use std::collections::HashMap;

#[derive(Debug)]
#[allow(dead_code)]
struct FolderContent {
  folders: HashMap<String, FolderContent>,
  files: Vec<String>,
}

fn list_folder_recursive(fs: &CameraFS, folder_name: &str) -> Result<FolderContent> {
  let folders_iter = fs.list_folders(folder_name).wait()?;
  let mut folders = HashMap::with_capacity(folders_iter.len());

  for folder in folders_iter {
    let folder_full_name =
      format!("{}/{folder}", if folder_name == "/" { "" } else { folder_name });
    folders.insert(folder, list_folder_recursive(fs, &folder_full_name)?);
  }

  let files = fs.list_files(folder_name).wait()?.collect();

  Ok(FolderContent { files, folders })
}

fn main() -> Result<()> {
  env_logger::init();

  let camera = Context::new()?.autodetect_camera().wait()?;
  let fs = camera.fs();

  let folders = list_folder_recursive(&fs, "/")?;

  println!("{:#?}", folders);
  Ok(())
}