home ~ projects ~ socials

Get All The Directories In A Directory Non-Recursively In Rust

This is how I'm getting a single list of directories in a given directory without recursing into it. (It also filters out directories that start with . or $

---
[dependencies]
anyhow = "1.0.98"
---

use anyhow::Result;
use std::fs;
use std::path::PathBuf;

fn main() -> Result<()> {
  let source_dir = PathBuf::from("/Users/alan/Desktop");
  let dirs = get_dirs_in_dir(&source_dir)?;
  for dir in dirs {
    println!("{}", dir.display());
  }
  Ok(())
}

pub fn get_dirs_in_dir(source_dir: &PathBuf) -> Result<Vec<PathBuf>> {
  Ok(fs::read_dir(source_dir)?
    .into_iter()
    .filter_map(|entry| entry.ok())
    .map(|entry| entry.path())
    .filter(|path| path.is_dir())
    .filter(|path| !path.starts_with("."))
    .filter(|path| !path.starts_with("$"))
    .collect::<Vec<PathBuf>>())
}
Output:
/Users/alan/Desktop/Untitled Session 1
/Users/alan/Desktop/tmp_video
/Users/alan/Desktop/$RECYCLE.BIN
/Users/alan/Desktop/Extending RSS 2.0 With Namespaces_files
/Users/alan/Desktop/Old Firefox Data
/Users/alan/Desktop/avif_gif_test
/Users/alan/Desktop/download_test
/Users/alan/Desktop/NEOPOLITAN-MOVE

Old notes

#![allow(unused)]
use std::fs;
use std::path::PathBuf;
use std::io::Error;

fn main() {
  let source_dir = PathBuf::from("/Users/alan/Desktop");
  match get_dirs_in_dir(&source_dir) {
    Ok(dirs) => { dbg!(dirs); () }
    Err(_) =>  { 
      println!("TODO: Handle Error");
    }
  }
}

fn get_dirs_in_dir(source_dir: &PathBuf) -> Result<Vec<PathBuf>, Error> {
  Ok(fs::read_dir(source_dir)?
    .into_iter()
    .filter_map(|entry| {
      match entry {
        Ok(item) => { 
          Some(item)
        }
        Err(_) => { 
          None 
        }
      }
    })
    .filter_map(|item| {
      if item.path().is_dir() {
        Some(item.path())
      } else {
        None
      }
    })
    .filter(|item| {
      match item.file_name() {
        Some(fname) => {
          !fname.to_string_lossy().starts_with("$")
          &&
          !fname.to_string_lossy().starts_with(".")
        }
        None => false 
    }})
    .collect::<Vec<_>>())
}
Output:
[_active_nvim_run:9:19] dirs = [
    "/Users/alan/Desktop/Untitled Session 1",
    "/Users/alan/Desktop/tmp_video",
    "/Users/alan/Desktop/Extending RSS 2.0 With Namespaces_files",
    "/Users/alan/Desktop/Old Firefox Data",
    "/Users/alan/Desktop/avif_gif_test",
    "/Users/alan/Desktop/download_test",
    "/Users/alan/Desktop/NEOPOLITAN-MOVE",
]
-- end of line --