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