diff --git a/helper/README.md b/helper/README.md index c9fa77e..20f1ef8 100644 --- a/helper/README.md +++ b/helper/README.md @@ -152,7 +152,7 @@ fmt.Println(actual) // [2, 4, 6, 8, 10, 12, 14, 16, 18, 20] ``` -## func [AppendOrWriteToCsvFile]() +## func [AppendOrWriteToCsvFile]() ```go func AppendOrWriteToCsvFile[T any](fileName string, hasHeader bool, rows <-chan *T) error @@ -553,7 +553,7 @@ fmt.Println(helper.ChanToSlice(squared)) // [4, 9, 25, 100] ``` -## func [ReadFromCsvFile]() +## func [ReadFromCsvFile]() ```go func ReadFromCsvFile[T any](fileName string, hasHeader bool) (<-chan *T, error) diff --git a/helper/csv.go b/helper/csv.go index 3763b6d..a8067c1 100644 --- a/helper/csv.go +++ b/helper/csv.go @@ -168,13 +168,13 @@ func (c *Csv[T]) ReadFromFile(fileName string) (<-chan *T, error) { // file's column order matches the field order of the given row struct to ensure consistent // data structure. func (c *Csv[T]) AppendToFile(fileName string, rows <-chan *T) error { - return c.writeToFileWithFlag(fileName, os.O_APPEND, rows) + return c.writeToFileWithFlag(fileName, true, rows) } // WriteToFile creates a new file with the given name and writes the provided rows // of data to it, overwriting any existing content. func (c *Csv[T]) WriteToFile(fileName string, rows <-chan *T) error { - return c.writeToFileWithFlag(fileName, os.O_CREATE, rows) + return c.writeToFileWithFlag(fileName, false, rows) } // updateColumnIndexes aligns column indices to match the order of column headers. @@ -203,13 +203,22 @@ func (c *Csv[T]) updateColumnIndexes(csvReader *csv.Reader) error { // writeToFileWithFlag writes the provided rows of data to a file with the given name, using the // specified flag mode for precise control over file opening and writing behavior. -func (c *Csv[T]) writeToFileWithFlag(fileName string, flag int, rows <-chan *T) error { - file, err := os.OpenFile(filepath.Clean(fileName), flag|os.O_WRONLY, 0600) +func (c *Csv[T]) writeToFileWithFlag(fileName string, appendRows bool, rows <-chan *T) error { + var file *os.File + var err error + + // Gosec complains if flag is a variable. + if appendRows { + file, err = os.OpenFile(filepath.Clean(fileName), os.O_APPEND|os.O_WRONLY, 0600) + } else { + file, err = os.OpenFile(filepath.Clean(fileName), os.O_CREATE|os.O_WRONLY, 0600) + } + if err != nil { return err } - writeHeader := c.hasHeader && (flag == os.O_CREATE) + writeHeader := c.hasHeader && !appendRows err = c.writeToWriter(file, writeHeader, rows) if err != nil { diff --git a/pre-commit.sh b/pre-commit.sh index c040940..324f4e3 100755 --- a/pre-commit.sh +++ b/pre-commit.sh @@ -3,11 +3,12 @@ (command -v revive) || go install github.com/mgechev/revive@latest (command -v staticcheck) || go install honnef.co/go/tools/cmd/staticcheck@latest (command -v gomarkdoc) || go install github.com/princjef/gomarkdoc/cmd/gomarkdoc@latest - +(command -v gosec) || go install github.com/securego/gosec/v2/cmd/gosec@latest go fmt ./... go fix ./... go vet ./... go test -cover ./... +gosec ./... revive -config=revive.toml ./... staticcheck ./...