use super::RuntimeError;
use crate::{Build, FileSystemTree, MergeableFileSystemTree, Node};
use pipe_trait::Pipe;
use serde::de::DeserializeOwned;
use serde_yaml::from_reader;
use std::{
io,
path::{Path, PathBuf},
};
pub fn run<Tree, Path>(target: &Path) -> Result<(), RuntimeError<Path::Owned>>
where
Path: ToOwned + AsRef<Path> + ?Sized,
Path::Owned: AsRef<Path>,
Tree: Build<Path::Owned, io::Error, BorrowedPath = Path, OwnedPath = Path::Owned>
+ Node
+ DeserializeOwned,
Tree::DirectoryContent: IntoIterator<Item = (Path::Owned, Tree)>,
Path: Ord,
{
io::stdin()
.pipe(from_reader::<_, Tree>)?
.build(target)?
.pipe(Ok)
}
pub type Run = fn(&Path) -> Result<(), RuntimeError<PathBuf>>;
pub const CREATE: Run = run::<FileSystemTree<PathBuf, String>, Path>;
pub const POPULATE: Run = run::<MergeableFileSystemTree<PathBuf, String>, Path>;