From 4d71a37916fa87884a8376e02bd4c2db0dde91c1 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Mon, 2 May 2022 16:14:48 +0200 Subject: [PATCH] wip: switch to io/fs References: https://github.com/emersion/go-webdav/issues/40 --- client.go | 19 ++++++++++--------- webdav.go | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/client.go b/client.go index ad0a748..58c3ea4 100644 --- a/client.go +++ b/client.go @@ -3,6 +3,7 @@ package webdav import ( "fmt" "io" + "io/fs" "net/http" "time" @@ -74,13 +75,13 @@ var fileInfoPropfind = internal.NewPropNamePropfind( internal.GetETagName, ) -func fileInfoFromResponse(resp *internal.Response) (*FileInfo, error) { +func fileInfoFromResponse(resp *internal.Response) (*fileInfo, error) { path, err := resp.Path() if err != nil { return nil, err } - fi := &FileInfo{Path: path} + fi := FileInfo{Path: path} var resType internal.ResourceType if err := resp.DecodeProp(&resType); err != nil { @@ -116,10 +117,10 @@ func fileInfoFromResponse(resp *internal.Response) (*FileInfo, error) { } fi.ModTime = time.Time(getMod.LastModified) - return fi, nil + return &fileInfo{fi}, nil } -func (c *Client) Stat(name string) (*FileInfo, error) { +func (c *Client) Stat(name string) (fs.FileInfo, error) { resp, err := c.ic.PropfindFlat(name, fileInfoPropfind) if err != nil { return nil, err @@ -141,24 +142,24 @@ func (c *Client) Open(name string) (io.ReadCloser, error) { return resp.Body, nil } -func (c *Client) Readdir(name string, recursive bool) ([]FileInfo, error) { +func (c *Client) ReadDir(name string) ([]fs.DirEntry, error) { depth := internal.DepthOne - if recursive { + /*if recursive { depth = internal.DepthInfinity - } + }*/ ms, err := c.ic.Propfind(name, depth, fileInfoPropfind) if err != nil { return nil, err } - l := make([]FileInfo, 0, len(ms.Responses)) + l := make([]fs.DirEntry, 0, len(ms.Responses)) for _, resp := range ms.Responses { fi, err := fileInfoFromResponse(&resp) if err != nil { return l, err } - l = append(l, *fi) + l = append(l, fi) } return l, nil diff --git a/webdav.go b/webdav.go index 4dd369c..5188d74 100644 --- a/webdav.go +++ b/webdav.go @@ -4,6 +4,8 @@ package webdav import ( + "io/fs" + "path" "time" ) @@ -15,3 +17,48 @@ type FileInfo struct { MIMEType string ETag string } + +type fileInfo struct { + FileInfo +} + +var ( + _ fs.FileInfo = (*fileInfo)(nil) + _ fs.DirEntry = (*fileInfo)(nil) +) + +func (fi *fileInfo) Name() string { + return path.Base(fi.Path) +} + +func (fi *fileInfo) Size() int64 { + return fi.FileInfo.Size +} + +func (fi *fileInfo) Mode() fs.FileMode { + var mode fs.FileMode + if fi.FileInfo.IsDir { + mode |= fs.ModeDir + } + return mode +} + +func (fi *fileInfo) ModTime() time.Time { + return fi.FileInfo.ModTime +} + +func (fi *fileInfo) IsDir() bool { + return fi.FileInfo.IsDir +} + +func (fi *fileInfo) Sys() interface{} { + return nil +} + +func (fi *fileInfo) Type() fs.FileMode { + return fi.Mode() +} + +func (fi *fileInfo) Info() (fs.FileInfo, error) { + return fi, nil +}