diff --git a/tee/tee.go b/tee/tee.go new file mode 100644 index 0000000..843ec5e --- /dev/null +++ b/tee/tee.go @@ -0,0 +1,72 @@ +package tee + +import ( + "fmt" + "os" +) + +// Tee emulates the Unix tee(1) command. +type Tee struct { + f *os.File +} + +func (t *Tee) Write(p []byte) (int64, error) { + n, err := os.Stdout.Write(p) + if err != nil { + return n, err + } + + return file.Write(p) +} + +func (t *Tee) Close() error { + return t.f.Close() +} + +// NewOut writes to standard output only. The file is created, not +// appended to. +func NewOut(logFile string) (*Tee, error) { + if logFile == "" { + return &Tee{}, nil + } + + f, err := os.Create(logFile) + if err !=nil { + return nil, err + } + return &Tee{f: f}, nil +} + + +// Printf formats according to a format specifier and writes to the +// tee instance. +func (t *Tee) Printf(format string, args ...interface{}) (int64, error) { + s := fmt.Sprintf(format, args...) + n, err := os.Stdout.Write(s) + if err != nil { + return n, err + } + + if t.f == nil { + return n, err + } + + return t.f.WriteString(s) +} + +var globalTee = &Tee{} + +// Open will attempt to open the logFile for the global tee instance. +func Open(logFile string) error { + f, err := os.Create(logFile) + if err !=nil { + return err + } + globalTee.f = f +} + +// Printf formats according to a format specifier and writes to the +// global tee. +func Printf(format string, args ...interface{}) (int64, error) { + return globalTee.Printf(format, args...) +}