github.com/hirochachacha/plua@v0.0.0-20170217012138-c82f520cc725/internal/file/file.go (about) 1 package file 2 3 import ( 4 "bufio" 5 "os" 6 ) 7 8 const ( 9 IONBF = iota 10 IOFBF 11 IOLBF 12 ) 13 14 type File interface { 15 IsClosed() bool 16 Close() error 17 Write(p []byte) (nn int, err error) 18 WriteString(s string) (nn int, err error) 19 Flush() error 20 UnreadByte() error 21 ReadByte() (c byte, err error) 22 Read(p []byte) (n int, err error) 23 ReadBytes(delim byte) (line []byte, err error) 24 Seek(offset int64, whence int) (n int64, err error) 25 Setvbuf(mode int, size int) (err error) 26 } 27 28 func newFile(f *os.File, std bool) File { 29 return &file{ 30 File: f, 31 state: seek, 32 br: bufio.NewReader(f), 33 bw: bufio.NewWriter(f), 34 std: std, 35 } 36 } 37 38 func newReadOnlyFile(f *os.File, std bool) File { 39 return &rofile{ 40 File: f, 41 br: bufio.NewReader(f), 42 std: std, 43 } 44 } 45 46 func newWriteOnlyFile(f *os.File, std bool) File { 47 return &wofile{ 48 File: f, 49 bw: bufio.NewWriter(f), 50 std: std, 51 } 52 } 53 54 func NewFile(f *os.File, flag int, std bool) File { 55 switch flag & (os.O_RDONLY | os.O_WRONLY | os.O_RDWR) { 56 case os.O_RDONLY: 57 return newReadOnlyFile(f, std) 58 case os.O_WRONLY: 59 return newWriteOnlyFile(f, std) 60 case os.O_RDWR: 61 return newFile(f, std) 62 default: 63 panic("unreachable") 64 } 65 } 66 67 func OpenFile(name string, flag int, perm os.FileMode) (file File, err error) { 68 f, err := os.OpenFile(name, flag, perm) 69 if err != nil { 70 return nil, err 71 } 72 73 return NewFile(f, flag, false), nil 74 }