Skip to content

Instantly share code, notes, and snippets.

@JosephTLyons
Last active April 10, 2023 09:16
Show Gist options
  • Save JosephTLyons/70b1caf29b6d1cad7ffff1d8a153c3b4 to your computer and use it in GitHub Desktop.
Save JosephTLyons/70b1caf29b6d1cad7ffff1d8a153c3b4 to your computer and use it in GitHub Desktop.
Pretend filesystem in Rust
enum Item {
File(File),
Directory(Directory),
}
struct File {
name: String,
}
impl File {
fn new(name: &str) -> File {
File { name: name.into() }
}
}
struct Directory {
name: String,
items: Vec<Item>,
}
impl Directory {
pub fn new(name: &str) -> Directory {
Directory {
name: name.into(),
items: vec![],
}
}
pub fn create_file(&mut self, name: &str) {
self.items.push(Item::File(File::new(name)))
}
pub fn add_file(&mut self, file: File) {
self.items.push(Item::File(file));
}
pub fn create_directory(&mut self, name: &str) {
self.items.push(Item::Directory(Directory::new(name)))
}
pub fn add_directory(&mut self, directory: Directory) {
self.items.push(Item::Directory(directory));
}
pub fn print_items(&self) {
println!("{}", self.name);
Directory::print_items_internal(self, "| ".into());
}
fn print_items_internal(directory: &Directory, indentation: String) {
for item in &directory.items {
match item {
Item::File(file) => println!("{}{}", indentation, file.name),
Item::Directory(directory) => {
println!("{}{}", indentation, directory.name);
Directory::print_items_internal(directory, format!("{}| ", indentation));
}
}
}
}
}
fn main() {
let mut people_dir = Directory::new("people");
people_dir.create_file("bob.txt".into());
people_dir.create_file("joe.txt".into());
people_dir.create_file("sam.txt".into());
people_dir.create_file("seth.txt".into());
let mut animal_dir = Directory::new("animals");
animal_dir.create_file("alligator.txt".into());
animal_dir.create_file("bird.txt".into());
animal_dir.add_directory(people_dir);
animal_dir.create_file("zebra.txt".into());
let mut numbers_dir = Directory::new("numbers");
numbers_dir.create_file("one.txt".into());
numbers_dir.create_file("two.txt".into());
numbers_dir.create_file("three.txt".into());
let mut letters_dir = Directory::new("letters");
letters_dir.create_file("a.txt".into());
letters_dir.create_file("b.txt".into());
letters_dir.create_file("c.txt".into());
let mut symbols_dir = Directory::new("symbols");
symbols_dir.create_file("exclamation.txt".into());
symbols_dir.create_file("question.txt".into());
symbols_dir.create_file("asterisk.txt".into());
let mut misc_dir = Directory::new("misc");
misc_dir.add_directory(numbers_dir);
misc_dir.add_directory(letters_dir);
misc_dir.add_directory(symbols_dir);
let mut root = Directory::new("/");
root.add_directory(animal_dir);
root.add_directory(misc_dir);
root.print_items();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment