72 lines
1.2 KiB
Go
72 lines
1.2 KiB
Go
|
package script
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/csv"
|
||
|
"errors"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
// CSV creates csv.Writer writing to underlying file.
|
||
|
// Do not forget to call Close method once you are done.
|
||
|
func NewCSVWriter(filename string) (*CSVWriter, error) {
|
||
|
return newCSVwriter(filename)
|
||
|
}
|
||
|
|
||
|
type CSVWriter struct {
|
||
|
f *os.File
|
||
|
wr *csv.Writer
|
||
|
err error
|
||
|
}
|
||
|
|
||
|
// Write writer row to csv. Writes are buffered
|
||
|
func (c *CSVWriter) Write(_ context.Context, record []string) error {
|
||
|
err := c.wr.Write(record)
|
||
|
c.err = err
|
||
|
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Close flushes underlying csv.Writer and closes
|
||
|
// file.
|
||
|
func (c *CSVWriter) Close() error {
|
||
|
c.wr.Flush()
|
||
|
flushErr := c.wr.Error()
|
||
|
closeErr := c.f.Close()
|
||
|
|
||
|
err := errors.Join(flushErr, closeErr)
|
||
|
c.err = err
|
||
|
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// Error return last encountered error.
|
||
|
func (c *CSVWriter) Error() error {
|
||
|
return c.err
|
||
|
}
|
||
|
|
||
|
func newCSVwriter(name string) (*CSVWriter, error) {
|
||
|
var (
|
||
|
f *os.File
|
||
|
err error
|
||
|
)
|
||
|
|
||
|
if _, err = os.Stat(name); err == nil {
|
||
|
f, err = os.OpenFile(name, os.O_APPEND|os.O_WRONLY, 0664)
|
||
|
} else {
|
||
|
f, err = os.Create(name)
|
||
|
}
|
||
|
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
csvwr := csv.NewWriter(f)
|
||
|
|
||
|
return &CSVWriter{f: f, wr: csvwr}, nil
|
||
|
}
|