diff options
Diffstat (limited to 'crates/shirabe/src/package/archiver')
| -rw-r--r-- | crates/shirabe/src/package/archiver/archivable_files_filter.rs | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/crates/shirabe/src/package/archiver/archivable_files_filter.rs b/crates/shirabe/src/package/archiver/archivable_files_filter.rs index 890513a..a267cf1 100644 --- a/crates/shirabe/src/package/archiver/archivable_files_filter.rs +++ b/crates/shirabe/src/package/archiver/archivable_files_filter.rs @@ -1 +1,46 @@ //! ref: composer/src/Composer/Package/Archiver/ArchivableFilesFilter.php + +use std::path::PathBuf; +use shirabe_php_shim::PharData; + +pub struct ArchivableFilesFilter { + inner: Box<dyn Iterator<Item = PathBuf>>, + dirs: Vec<String>, +} + +impl ArchivableFilesFilter { + pub fn new(inner: Box<dyn Iterator<Item = PathBuf>>) -> Self { + Self { + inner, + dirs: Vec::new(), + } + } + + fn accept(&mut self, file: &PathBuf) -> bool { + if file.is_dir() { + self.dirs.push(file.to_string_lossy().into_owned()); + return false; + } + true + } + + pub fn add_empty_dir(&self, phar: &PharData, sources: &str) { + for filepath in &self.dirs { + let localname = filepath.replace(&format!("{}/", sources), ""); + phar.add_empty_dir(&localname); + } + } +} + +impl Iterator for ArchivableFilesFilter { + type Item = PathBuf; + + fn next(&mut self) -> Option<PathBuf> { + loop { + let file = self.inner.next()?; + if self.accept(&file) { + return Some(file); + } + } + } +} |
