| // Copyright 2023 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package fs |
| |
| // ReadLinkFS is the interface implemented by a file system |
| // that supports reading symbolic links. |
| type ReadLinkFS interface { |
| FS |
| |
| // ReadLink returns the destination of the named symbolic link. |
| // If there is an error, it should be of type [*PathError]. |
| ReadLink(name string) (string, error) |
| |
| // Lstat returns a [FileInfo] describing the named file. |
| // If the file is a symbolic link, the returned [FileInfo] describes the symbolic link. |
| // Lstat makes no attempt to follow the link. |
| // If there is an error, it should be of type [*PathError]. |
| Lstat(name string) (FileInfo, error) |
| } |
| |
| // ReadLink returns the destination of the named symbolic link. |
| // |
| // If fsys does not implement [ReadLinkFS], then ReadLink returns an error. |
| func ReadLink(fsys FS, name string) (string, error) { |
| sym, ok := fsys.(ReadLinkFS) |
| if !ok { |
| return "", &PathError{Op: "readlink", Path: name, Err: ErrInvalid} |
| } |
| return sym.ReadLink(name) |
| } |
| |
| // Lstat returns a [FileInfo] describing the named file. |
| // If the file is a symbolic link, the returned [FileInfo] describes the symbolic link. |
| // Lstat makes no attempt to follow the link. |
| // |
| // If fsys does not implement [ReadLinkFS], then Lstat is identical to [Stat]. |
| func Lstat(fsys FS, name string) (FileInfo, error) { |
| sym, ok := fsys.(ReadLinkFS) |
| if !ok { |
| return Stat(fsys, name) |
| } |
| return sym.Lstat(name) |
| } |