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  }