1// Copyright © 2014 Steve Francia <spf@spf13.com>.
2// Copyright 2013 tsuru authors. All rights reserved.
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15// Package afero provides types and methods for interacting with the filesystem,
16// as an abstraction layer.
17
18// Afero also provides a few implementations that are mostly interoperable. One that
19// uses the operating system filesystem, one that uses memory to store files
20// (cross platform) and an interface that should be implemented if you want to
21// provide your own filesystem.
22
23package afero
24
25import (
26	"errors"
27	"io"
28	"os"
29	"time"
30)
31
32type Afero struct {
33	Fs
34}
35
36// File represents a file in the filesystem.
37type File interface {
38	io.Closer
39	io.Reader
40	io.ReaderAt
41	io.Seeker
42	io.Writer
43	io.WriterAt
44
45	Name() string
46	Readdir(count int) ([]os.FileInfo, error)
47	Readdirnames(n int) ([]string, error)
48	Stat() (os.FileInfo, error)
49	Sync() error
50	Truncate(size int64) error
51	WriteString(s string) (ret int, err error)
52}
53
54// Fs is the filesystem interface.
55//
56// Any simulated or real filesystem should implement this interface.
57type Fs interface {
58	// Create creates a file in the filesystem, returning the file and an
59	// error, if any happens.
60	Create(name string) (File, error)
61
62	// Mkdir creates a directory in the filesystem, return an error if any
63	// happens.
64	Mkdir(name string, perm os.FileMode) error
65
66	// MkdirAll creates a directory path and all parents that does not exist
67	// yet.
68	MkdirAll(path string, perm os.FileMode) error
69
70	// Open opens a file, returning it or an error, if any happens.
71	Open(name string) (File, error)
72
73	// OpenFile opens a file using the given flags and the given mode.
74	OpenFile(name string, flag int, perm os.FileMode) (File, error)
75
76	// Remove removes a file identified by name, returning an error, if any
77	// happens.
78	Remove(name string) error
79
80	// RemoveAll removes a directory path and any children it contains. It
81	// does not fail if the path does not exist (return nil).
82	RemoveAll(path string) error
83
84	// Rename renames a file.
85	Rename(oldname, newname string) error
86
87	// Stat returns a FileInfo describing the named file, or an error, if any
88	// happens.
89	Stat(name string) (os.FileInfo, error)
90
91	// The name of this FileSystem
92	Name() string
93
94	//Chmod changes the mode of the named file to mode.
95	Chmod(name string, mode os.FileMode) error
96
97	//Chtimes changes the access and modification times of the named file
98	Chtimes(name string, atime time.Time, mtime time.Time) error
99}
100
101var (
102	ErrFileClosed        = errors.New("File is closed")
103	ErrOutOfRange        = errors.New("Out of range")
104	ErrTooLarge          = errors.New("Too large")
105	ErrFileNotFound      = os.ErrNotExist
106	ErrFileExists        = os.ErrExist
107	ErrDestinationExists = os.ErrExist
108)
109