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 }