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
mod dir_content; pub use dir_content::*; use derive_more::{AsMut, AsRef, Deref, DerefMut, From, Into}; use serde::{Deserialize, Serialize}; use std::collections::BTreeMap; /// Representation of a filesystem which contains only [files](FileSystemTree::File) /// and [directories](FileSystemTree::Directory). /// /// The serialization of `FileContent` (content of file) and `BTreeMap<Path, Self>` /// (children of directory) must not share the same type. That is, `FileContent` must /// be serialized to things other than a dictionary. /// /// **Note:** [`FileSystemTree::build`](crate::Build::build) cannot write over an existing /// directory. Use [`MergeableFileSystemTree`] instead if you desire such behavior. /// /// **Generic parameters:** /// * `Path`: Reference to a file in the filesystem. /// * `FileContent`: Content of a file. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(untagged)] pub enum FileSystemTree<Path, FileContent> where Path: Ord, { /// Represents a file with its content. /// Its YAML representation must not have the same type as [`FileSystemTree::Directory`]'s. File(FileContent), /// Represents a directory with its children. /// It is a set of name-to-subtree mappings. /// Its YAML representation must not have the same type as [`FileSystemTree::File`]'s. Directory(BTreeMap<Path, Self>), } /// Representation of a filesystem which contains only [files](FileSystemTree::File) /// and [directories](FileSystemTree::Directory). /// /// The serialization of `FileContent` (content of file) and `BTreeMap<Path, Self>` /// (children of directory) must not share the same type. That is, `FileContent` must /// be serialized to things other than a dictionary. /// /// **Generic parameters:** /// * `Path`: Reference to a file in the filesystem. /// * `FileContent`: Content of a file. /// /// **Difference from [`FileSystemTree`]:** /// [`FileSystemTree::build`](crate::Build::build) cannot write over an existing directory. /// On the other hand, [`MergeableFileSystemTree::build`](crate::Build::build) either merges /// the two directories if there's no conflict. #[derive( Debug, Clone, PartialEq, Eq, Serialize, Deserialize, AsMut, AsRef, Deref, DerefMut, From, Into, )] pub struct MergeableFileSystemTree<Path, FileContent>(FileSystemTree<Path, FileContent>) where Path: Ord; mod methods;