| // 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) | |
| } | |