Bladeren bron

Use the optional argument trick

Benjamin Sago 8 jaren geleden
bovenliggende
commit
0aa33595d7
2 gewijzigde bestanden met toevoegingen van 15 en 14 verwijderingen
  1. 5 5
      src/fs/dir.rs
  2. 10 9
      src/fs/file.rs

+ 5 - 5
src/fs/dir.rs

@@ -114,10 +114,10 @@ impl<'dir> Files<'dir> {
     fn next_visible_file(&mut self) -> Option<Result<File<'dir>, (PathBuf, io::Error)>> {
         loop {
             if let Some(path) = self.inner.next() {
-                let filen = File::filename(path);
-                if !self.dotfiles && filen.starts_with(".") { continue }
+                let filename = File::filename(path);
+                if !self.dotfiles && filename.starts_with(".") { continue }
 
-                return Some(File::new(path.clone(), Some(self.dir), Some(filen))
+                return Some(File::new(path.clone(), self.dir, filename)
                                  .map_err(|e| (path.clone(), e)))
             }
             else {
@@ -148,12 +148,12 @@ impl<'dir> Iterator for Files<'dir> {
     fn next(&mut self) -> Option<Self::Item> {
         if let Dots::DotNext = self.dots {
             self.dots = Dots::DotDotNext;
-            Some(File::new(self.dir.path.to_path_buf(), Some(self.dir), Some(String::from(".")))
+            Some(File::new(self.dir.path.to_path_buf(), self.dir, String::from("."))
                       .map_err(|e| (Path::new(".").to_path_buf(), e)))
         }
         else if let Dots::DotDotNext = self.dots {
             self.dots = Dots::FilesNext;
-            Some(File::new(self.parent(), Some(self.dir), Some(String::from("..")))
+            Some(File::new(self.parent(), self.dir, String::from(".."))
                       .map_err(|e| (self.parent(), e)))
         }
         else {

+ 10 - 9
src/fs/file.rs

@@ -57,15 +57,16 @@ pub struct File<'dir> {
 }
 
 impl<'dir> File<'dir> {
-    pub fn new(path: PathBuf, parent_dir: Option<&'dir Dir>, mut filename: Option<String>) -> IOResult<File<'dir>> {
-        if filename.is_none() {
-            filename = Some(File::filename(&path));
-        }
-
-        let metadata = fs::symlink_metadata(&path)?;
-        let ext      = File::ext(&path);
-
-        Ok(File { path, parent_dir, metadata, ext, name: filename.unwrap() })
+    pub fn new<PD, FN>(path: PathBuf, parent_dir: PD, filename: FN) -> IOResult<File<'dir>>
+    where PD: Into<Option<&'dir Dir>>,
+          FN: Into<Option<String>>
+    {
+        let parent_dir = parent_dir.into();
+        let metadata   = fs::symlink_metadata(&path)?;
+        let name       = filename.into().unwrap_or_else(|| File::filename(&path));
+        let ext        = File::ext(&path);
+
+        Ok(File { path, parent_dir, metadata, ext, name })
     }
 
     /// A file’s name is derived from its string. This needs to handle directories