dir-structure 0.1.0

Simple crate to create directory structures.
Documentation

A library for reading and writing directory structures.

This library provides a macro for defining directory structures, and a trait for reading and writing those structures to / from disk.

Example

Writing a structure to disk

use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
use dir_structure::DirStructureItem;
#[derive(dir_structure::DirStructure)]
struct Dir {
#[dir_structure(path = "f1.txt")]
f1: String,
#[dir_structure(path = "subdir/f2.txt")]
f2: String,
// default path is just a file name from the field's name.
f3: String,
// also works with nested structures
#[dir_structure(path = "subdir2")]
subdir: Subdir,
}
#[derive(dir_structure::DirStructure)]
struct Subdir {
#[dir_structure(path = "f4.txt")]
f4: String,
}

let d = Path::new("dir");
Dir {
f1: "f1".to_owned(),
f2: "f2".to_owned(),
f3: "f3".to_owned(),
subdir: Subdir {
f4: "f4".to_owned(),
},
}.write(&d)?;
assert_eq!(std::fs::read_to_string(d.join("f1.txt"))?, "f1");
assert_eq!(std::fs::read_to_string(d.join("subdir/f2.txt"))?, "f2");
assert_eq!(std::fs::read_to_string(d.join("f3"))?, "f3");
assert_eq!(std::fs::read_to_string(d.join("subdir2/f4.txt"))?, "f4");

# std::fs::remove_dir_all(&d)?;

Ok(())
}

Reading a structure from disk

use std::path::Path;
fn main() -> Result<(), Box<dyn std::error::Error>> {
use dir_structure::DirStructureItem;
#[derive(dir_structure::DirStructure)]
struct Dir {
#[dir_structure(path = "f1.txt")]
f1: String,
#[dir_structure(path = "subdir/f2.txt")]
f2: String,
// default path is just a file name from the field's name.
f3: String,
// also works with nested structures
#[dir_structure(path = "subdir2")]
subdir: Subdir,
}
#[derive(dir_structure::DirStructure)]
struct Subdir {
#[dir_structure(path = "f4.txt")]
f4: String,
}
let d = Path::new("dir");
std::fs::create_dir_all(&d)?;
std::fs::create_dir_all(d.join("subdir"))?;
std::fs::create_dir_all(d.join("subdir2"))?;
std::fs::write(d.join("f1.txt"), "f1")?;
std::fs::write(d.join("subdir/f2.txt"), "f2")?;
std::fs::write(d.join("f3"), "f3")?;
std::fs::write(d.join("subdir2/f4.txt"), "f4")?;
let dir = Dir::read(&d)?;
assert_eq!(dir.f1, "f1");
assert_eq!(dir.f2, "f2");
assert_eq!(dir.f3, "f3");
assert_eq!(dir.subdir.f4, "f4");

# std::fs::remove_dir_all(&d)?;

Ok(())
}