Skip to content

Commit d832a7d

Browse files
committed
Feat - showing file size along side their name, with --size or -z
1 parent 2264932 commit d832a7d

2 files changed

Lines changed: 48 additions & 3 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ sudo cp target/release/struct /usr/local/bin/
4545
```bash
4646
struct 3 # Show structure up to depth 3
4747
struct 0 # Show everything (infinite depth)
48+
struct --size 2 # Show file sizes
4849
struct -g 2 # Git-tracked files only
4950
struct -s 100 3 # Skip folders larger than 100MB
5051
struct -i "*.log" 2 # Add custom ignore patterns

src/main.rs

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,10 @@ struct Args {
115115
#[arg(short = 's', long = "skip-large")]
116116
max_size_mb: Option<u64>,
117117

118+
/// Show file sizes
119+
#[arg(short = 'z', long = "size")]
120+
show_size: bool,
121+
118122
/// Starting directory
119123
#[arg(default_value = ".")]
120124
path: PathBuf,
@@ -143,6 +147,7 @@ struct StructConfig {
143147
custom_ignores: Vec<Regex>,
144148
max_size_bytes: Option<u64>,
145149
git_files: Option<HashSet<PathBuf>>,
150+
show_size: bool,
146151
}
147152

148153
fn main() {
@@ -215,6 +220,7 @@ fn main() {
215220
custom_ignores,
216221
max_size_bytes,
217222
git_files,
223+
show_size: args.show_size,
218224
};
219225

220226
println!("{}", args.path.display().to_string().cyan());
@@ -280,6 +286,22 @@ fn get_dir_size(path: &Path) -> u64 {
280286
.sum()
281287
}
282288

289+
fn format_size(bytes: u64) -> String {
290+
const KB: u64 = 1024;
291+
const MB: u64 = KB * 1024;
292+
const GB: u64 = MB * 1024;
293+
294+
if bytes >= GB {
295+
format!("{:.1}G", bytes as f64 / GB as f64)
296+
} else if bytes >= MB {
297+
format!("{:.1}M", bytes as f64 / MB as f64)
298+
} else if bytes >= KB {
299+
format!("{:.1}K", bytes as f64 / KB as f64)
300+
} else {
301+
format!("{}B", bytes)
302+
}
303+
}
304+
283305
fn display_tree(
284306
path: &Path,
285307
config: &StructConfig,
@@ -323,8 +345,16 @@ fn display_tree(
323345

324346
let connector = if is_last_entry { "└── " } else { "├── " };
325347
let dir_name = format!("{}/", name).blue().bold();
326-
let count_msg = format!(" ({} files ignored)", ignored_count).bright_black();
327-
println!("{}{}{}{}", prefix, connector, dir_name, count_msg);
348+
349+
if config.show_size {
350+
let size = get_dir_size(&path);
351+
let size_str = format_size(size);
352+
let count_msg = format!(" ({}, {} files ignored)", size_str, ignored_count).bright_black();
353+
println!("{}{}{}{}", prefix, connector, dir_name, count_msg);
354+
} else {
355+
let count_msg = format!(" ({} files ignored)", ignored_count).bright_black();
356+
println!("{}{}{}{}", prefix, connector, dir_name, count_msg);
357+
}
328358
continue;
329359
}
330360

@@ -370,7 +400,21 @@ fn display_tree(
370400
name.normal()
371401
};
372402

373-
println!("{}{}{}", prefix, connector, display_name);
403+
// Add size if requested
404+
if config.show_size {
405+
if is_dir {
406+
println!("{}{}{}", prefix, connector, display_name);
407+
} else {
408+
if let Ok(metadata) = fs::metadata(&path) {
409+
let size_str = format!(" ({})", format_size(metadata.len())).bright_black();
410+
println!("{}{}{}{}", prefix, connector, display_name, size_str);
411+
} else {
412+
println!("{}{}{}", prefix, connector, display_name);
413+
}
414+
}
415+
} else {
416+
println!("{}{}{}", prefix, connector, display_name);
417+
}
374418

375419
// Recurse into directories
376420
if is_dir {

0 commit comments

Comments
 (0)