]> Cypherpunks.ru repositories - gostls13.git/commitdiff
io/fs: implement FileInfoToDirEntry
authorMichel Levieux <mlevieux42@gmail.com>
Thu, 18 Feb 2021 14:53:46 +0000 (15:53 +0100)
committerIan Lance Taylor <iant@golang.org>
Thu, 25 Mar 2021 21:35:05 +0000 (21:35 +0000)
Implements FileInfoToDirEntry which converts an fs.FileInfo to fs.DirEntry.

Fixes #42387.

Change-Id: Ie723b6ed583c6c5ecf22bbe64e3b6496f5114254
Reviewed-on: https://go-review.googlesource.com/c/go/+/293649
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Emmanuel Odeke <emmanuel@orijtech.com>
src/io/fs/readdir.go
src/io/fs/readdir_test.go

index 3a5aa6d86a6d73adb98ec4983e8b8215a836fb9a..2b10ddb0a3f407dd5c08387f1d8d1902d5eeace1 100644 (file)
@@ -45,3 +45,33 @@ func ReadDir(fsys FS, name string) ([]DirEntry, error) {
        sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() })
        return list, err
 }
+
+// dirInfo is a DirEntry based on a FileInfo.
+type dirInfo struct {
+       fileInfo FileInfo
+}
+
+func (di dirInfo) IsDir() bool {
+       return di.fileInfo.IsDir()
+}
+
+func (di dirInfo) Type() FileMode {
+       return di.fileInfo.Mode().Type()
+}
+
+func (di dirInfo) Info() (FileInfo, error) {
+       return di.fileInfo, nil
+}
+
+func (di dirInfo) Name() string {
+       return di.fileInfo.Name()
+}
+
+// FileInfoToDirEntry returns a DirEntry that returns information from info.
+// If info is nil, FileInfoToDirEntry returns nil.
+func FileInfoToDirEntry(info FileInfo) DirEntry {
+       if info == nil {
+               return nil
+       }
+       return dirInfo{fileInfo: info}
+}
index 405bfa67ca40583bcb096e06e09e6f9893d728c5..a2b2c121ffadbd32280630a75df42d6b2e12e581 100644 (file)
@@ -6,7 +6,10 @@ package fs_test
 
 import (
        . "io/fs"
+       "os"
        "testing"
+       "testing/fstest"
+       "time"
 )
 
 type readDirOnly struct{ ReadDirFS }
@@ -41,3 +44,50 @@ func TestReadDir(t *testing.T) {
        dirs, err = ReadDir(sub, ".")
        check("sub(.)", dirs, err)
 }
+
+func TestFileInfoToDirEntry(t *testing.T) {
+       testFs := fstest.MapFS{
+               "notadir.txt": {
+                       Data:    []byte("hello, world"),
+                       Mode:    0,
+                       ModTime: time.Now(),
+                       Sys:     &sysValue,
+               },
+               "adir": {
+                       Data:    nil,
+                       Mode:    os.ModeDir,
+                       ModTime: time.Now(),
+                       Sys:     &sysValue,
+               },
+       }
+
+       tests := []struct {
+               path     string
+               wantMode FileMode
+               wantDir  bool
+       }{
+               {path: "notadir.txt", wantMode: 0, wantDir: false},
+               {path: "adir", wantMode: os.ModeDir, wantDir: true},
+       }
+
+       for _, test := range tests {
+               test := test
+               t.Run(test.path, func(t *testing.T) {
+                       fi, err := Stat(testFs, test.path)
+                       if err != nil {
+                               t.Fatal(err)
+                       }
+
+                       dirEntry := FileInfoToDirEntry(fi)
+                       if g, w := dirEntry.Type(), test.wantMode; g != w {
+                               t.Errorf("FileMode mismatch: got=%v, want=%v", g, w)
+                       }
+                       if g, w := dirEntry.Name(), test.path; g != w {
+                               t.Errorf("Name mismatch: got=%v, want=%v", g, w)
+                       }
+                       if g, w := dirEntry.IsDir(), test.wantDir; g != w {
+                               t.Errorf("IsDir mismatch: got=%v, want=%v", g, w)
+                       }
+               })
+       }
+}