// Copyright 2011 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. // This file defines types for abstract file system access and // provides an implementation accessing the file system of the // underlying OS. package docview import ( "fmt" "io" "io/ioutil" "os" ) // The FileSystem interface specifies the methods godoc is using // to access the file system for which it serves documentation. type FileSystem interface { Open(path string) (io.ReadCloser, error) Lstat(path string) (os.FileInfo, error) Stat(path string) (os.FileInfo, error) ReadDir(path string) ([]os.FileInfo, error) } // ReadFile reads the file named by path from fs and returns the contents. func ReadFile(fs FileSystem, path string) ([]byte, error) { rc, err := fs.Open(path) if err != nil { return nil, err } defer rc.Close() return ioutil.ReadAll(rc) } // ---------------------------------------------------------------------------- // OS-specific FileSystem implementation var OS FileSystem = osFS{} // osFS is the OS-specific implementation of FileSystem type osFS struct{} func (osFS) Open(path string) (io.ReadCloser, error) { f, err := os.Open(path) if err != nil { return nil, err } fi, err := f.Stat() if err != nil { return nil, err } if fi.IsDir() { return nil, fmt.Errorf("Open: %s is a directory", path) } return f, nil } func (osFS) Lstat(path string) (os.FileInfo, error) { return os.Lstat(path) } func (osFS) Stat(path string) (os.FileInfo, error) { return os.Stat(path) } func (osFS) ReadDir(path string) ([]os.FileInfo, error) { return ioutil.ReadDir(path) // is sorted }