|  | // Copyright 2013 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 vfs defines types for abstract file system access and provides an | 
|  | // implementation accessing the file system of the underlying OS. | 
|  | package vfs // import "golang.org/x/tools/godoc/vfs" | 
|  |  | 
|  | import ( | 
|  | "io" | 
|  | "io/ioutil" | 
|  | "os" | 
|  | ) | 
|  |  | 
|  | // RootType indicates the type of files contained within a directory. | 
|  | // | 
|  | // It is used to indicate whether a directory is the root | 
|  | // of a GOROOT, a GOPATH, or neither. | 
|  | // An empty string represents the case when a directory is neither. | 
|  | type RootType string | 
|  |  | 
|  | const ( | 
|  | RootTypeGoRoot RootType = "GOROOT" | 
|  | RootTypeGoPath RootType = "GOPATH" | 
|  | ) | 
|  |  | 
|  | // The FileSystem interface specifies the methods godoc is using | 
|  | // to access the file system for which it serves documentation. | 
|  | type FileSystem interface { | 
|  | Opener | 
|  | Lstat(path string) (os.FileInfo, error) | 
|  | Stat(path string) (os.FileInfo, error) | 
|  | ReadDir(path string) ([]os.FileInfo, error) | 
|  | RootType(path string) RootType | 
|  | String() string | 
|  | } | 
|  |  | 
|  | // Opener is a minimal virtual filesystem that can only open regular files. | 
|  | type Opener interface { | 
|  | Open(name string) (ReadSeekCloser, error) | 
|  | } | 
|  |  | 
|  | // A ReadSeekCloser can Read, Seek, and Close. | 
|  | type ReadSeekCloser interface { | 
|  | io.Reader | 
|  | io.Seeker | 
|  | io.Closer | 
|  | } | 
|  |  | 
|  | // ReadFile reads the file named by path from fs and returns the contents. | 
|  | func ReadFile(fs Opener, path string) ([]byte, error) { | 
|  | rc, err := fs.Open(path) | 
|  | if err != nil { | 
|  | return nil, err | 
|  | } | 
|  | defer rc.Close() | 
|  | return ioutil.ReadAll(rc) | 
|  | } |