From 3c20c2c97c331ee8ec247a7a8c9bd0058f3614fc Mon Sep 17 00:00:00 2001 From: Moritz Gmeiner Date: Sun, 27 Jul 2025 00:24:48 +0200 Subject: [PATCH] dump.rs: added tree function --- src/dump.rs | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/dump.rs b/src/dump.rs index 43c2517..0633697 100644 --- a/src/dump.rs +++ b/src/dump.rs @@ -1,7 +1,8 @@ use std::io::Read; -use fat_rs::FatFs; +use fat_rs::dir::{DirIter, RegularDirEntry}; use fat_rs::fat::Fatty as _; +use fat_rs::{FatFs, SliceLike}; pub fn main() -> anyhow::Result<()> { let args = std::env::args(); @@ -38,5 +39,45 @@ pub fn main() -> anyhow::Result<()> { println!("{}", dir_entry); } + println!(); + println!(); + + tree(&fat_fs); + Ok(()) } + +fn tree(fat_fs: &FatFs) { + fn do_indent(indent: u32) { + for _ in 0..indent { + print!(" "); + } + } + + fn tree_impl( + fat_fs: &FatFs, + iter: impl Iterator, + indent: u32, + ) { + for dir_entry in iter.filter(|x| !x.is_hidden()) { + do_indent(indent); + + println!("{}", dir_entry); + + if dir_entry.is_dot() || dir_entry.is_dotdot() { + // do not descent into . and .. + continue; + } + + if dir_entry.is_dir() { + let reader = fat_fs.chain_reader(dir_entry.first_cluster()); + + let iter = DirIter::new(reader); + + tree_impl(fat_fs, iter, indent + 1); + } + } + } + + tree_impl(fat_fs, fat_fs.root_dir_iter(), 0); +}