1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
//! # etc
//!
//! [![etc](https://github.com/clearloop/etc/workflows/etc/badge.svg)](https://github.com/clearloop/etc)
//! [![crate](https://img.shields.io/crates/v/etc.svg)](https://crates.io/crates/etc)
//! [![doc](https://img.shields.io/badge/current-docs-brightgreen.svg)](https://docs.rs/etc/)
//! [![dependency status](https://deps.rs/repo/github/clearloop/etc/status.svg)](https://deps.rs/repo/github/clearloop/etc)
//! [![downloads](https://img.shields.io/crates/d/etc.svg)](https://crates.io/crates/etc)
//! [![LICENSE](https://img.shields.io/crates/l/etc.svg)](https://choosealicense.com/licenses/mit/)
//!
//! It's time to bundle etc for your awesome project!
//!
//! ```rust
//! use etc::{Etc, FileSystem, Read, Write};
//!
//! fn main() {
//!     // config root path
//!     let mut dir = std::env::temp_dir();
//!     dir.push(".etc.io");
//!
//!     // generate `/.etc.io` dir
//!     let etc = Etc::new(&dir).unwrap();
//!     let hello = etc.open("hello.md").unwrap();
//!
//!     // input and output
//!     assert!(hello.write(b"hello, world!\n").is_ok());
//!     assert_eq!(hello.read().unwrap(), b"hello, world!\n");
//!
//!     // remove hello.md
//!     assert!(etc.rm("hello.md").is_ok());
//!
//!     // hello.md has been removed
//!     let mut hello_md = dir.clone();
//!     hello_md.push("hello.md");
//!     assert!(!hello_md.exists());
//!
//!     // remove all
//!     assert!(etc.drain().is_ok());
//!     assert!(!dir.exists());
//! }
//! ```
//!
//! ## Loading dir with files' content into one struct!
//!
//! ```
//! use etc::{Etc, Tree, FileSystem, Write};
//! use std::{
//!   env,
//!   iter::FromIterator,
//!   path::PathBuf,
//! };
//!
//! fn main() {
//!     // config root path
//!     let mut dir = env::temp_dir();
//!     dir.push(".etc.load");
//!
//!     // write files
//!     let etc = Etc::new(&dir).unwrap();
//!     let amd = etc.open("mds/a.md").unwrap();
//!     let bmd = etc.open("mds/b.md").unwrap();
//!     assert!(amd.write(b"# hello").is_ok());
//!     assert!(bmd.write(b"# world").is_ok());
//!
//!     // batch and load
//!     let mut tree = Tree::batch(&etc).unwrap();
//!     assert!(tree.load().is_ok());
//!     assert_eq!(
//!         tree,
//!         Tree {
//!             path: PathBuf::from(&dir),
//!             content: None,
//!             children: Some(vec![Tree {
//!                 path: PathBuf::from_iter(&[&dir, &PathBuf::from("mds")]),
//!                 content: None,
//!                 children: Some(vec![
//!                     Tree {
//!                         path: PathBuf::from_iter(&[&dir, &PathBuf::from("mds/a.md")]),
//!                         content: Some(b"# hello".to_vec()),
//!                         children: None,
//!                     },
//!                     Tree {
//!                         path: PathBuf::from_iter(&[&dir, &PathBuf::from("mds/b.md")]),
//!                         content: Some(b"# world".to_vec()),
//!                         children: None,
//!                     }
//!                 ])
//!             }]),
//!         }
//!     );
//!
//!     // remove all
//!     assert!(etc.drain().is_ok());
//!     assert!(!dir.exists());
//! }
//! ```
//! ## LICENSE
//!
//! MIT
#![allow(clippy::needless_doctest_main)]
#![warn(missing_docs)]
mod error;
mod etc;
mod fs;
mod io;
mod meta;
mod tree;

pub use crate::{
    error::Error,
    etc::Etc,
    fs::FileSystem,
    io::{Read, Write},
    meta::Meta,
    tree::Tree,
};