mirror of
https://github.com/golang/go.git
synced 2025-05-08 17:13:05 +00:00
Add godoc/vfs/mapfs package for serving baked files. Fixes golang/go#6010. R=golang-dev, bradfitz, r, arnehormann, rsc CC=golang-dev https://golang.org/cl/12978043
82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
// 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 mapfs file provides an implementation of the FileSystem
|
|
// interface based on the contents of a map[string]string.
|
|
package mapfs
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"code.google.com/p/go.tools/godoc/vfs"
|
|
)
|
|
|
|
func New(m map[string]string) vfs.FileSystem {
|
|
return mapFS(m)
|
|
}
|
|
|
|
// mapFS is the map based implementation of FileSystem
|
|
type mapFS map[string]string
|
|
|
|
func (fs mapFS) String() string { return "mapfs" }
|
|
|
|
func (fs mapFS) Close() error { return nil }
|
|
|
|
func filename(p string) string {
|
|
if len(p) > 0 && p[0] == '/' {
|
|
p = p[1:]
|
|
}
|
|
return p
|
|
}
|
|
|
|
func (fs mapFS) Open(p string) (vfs.ReadSeekCloser, error) {
|
|
b, ok := fs[filename(p)]
|
|
if !ok {
|
|
return nil, os.ErrNotExist
|
|
}
|
|
return nopCloser{strings.NewReader(b)}, nil
|
|
}
|
|
|
|
func (fs mapFS) Lstat(p string) (os.FileInfo, error) {
|
|
b, ok := fs[filename(p)]
|
|
if !ok {
|
|
return nil, os.ErrNotExist
|
|
}
|
|
return mapFI{name: p, size: int64(len(b))}, nil
|
|
}
|
|
|
|
func (fs mapFS) Stat(p string) (os.FileInfo, error) {
|
|
return fs.Lstat(p)
|
|
}
|
|
|
|
func (fs mapFS) ReadDir(p string) ([]os.FileInfo, error) {
|
|
var list []os.FileInfo
|
|
for fn, b := range fs {
|
|
list = append(list, mapFI{name: fn, size: int64(len(b))})
|
|
}
|
|
return list, nil
|
|
}
|
|
|
|
// mapFI is the map-based implementation of FileInfo.
|
|
type mapFI struct {
|
|
name string
|
|
size int64
|
|
}
|
|
|
|
func (fi mapFI) IsDir() bool { return false }
|
|
func (fi mapFI) ModTime() time.Time { return time.Time{} }
|
|
func (fi mapFI) Mode() os.FileMode { return 0444 }
|
|
func (fi mapFI) Name() string { return fi.name }
|
|
func (fi mapFI) Size() int64 { return fi.size }
|
|
func (fi mapFI) Sys() interface{} { return nil }
|
|
|
|
type nopCloser struct {
|
|
io.ReadSeeker
|
|
}
|
|
|
|
func (nc nopCloser) Close() error { return nil }
|