-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfiles.go
129 lines (111 loc) · 2.5 KB
/
files.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package goat
import (
"bufio"
"encoding/csv"
"encoding/json"
"io"
"os"
"github.com/pkg/errors"
)
func FileExists(filePath string) (bool, error) {
info, err := os.Stat(filePath)
if err == nil {
return !info.IsDir(), nil
}
if errors.Is(err, os.ErrNotExist) {
return false, nil
}
return false, err
}
func WriteFile(filePath, contents string) error {
f, err := os.Create(filePath)
if err != nil {
return errors.Wrapf(err, "failed create file '%s'", filePath)
}
if _, err = f.WriteString(contents); err != nil {
return errors.Wrap(err, "failed to write to file")
}
err = f.Close()
if err != nil {
return errors.Wrapf(err, "failed to close file '%s'", filePath)
}
return nil
}
func ReadFileJSON[T any](filePath string, target *T) (*os.File, error) {
file, err := os.Open(filePath)
defer file.Close()
if err != nil {
return nil, errors.Wrap(err, "failed to read json file")
}
jsonParser := json.NewDecoder(file)
err = jsonParser.Decode(target)
if err != nil {
return nil, errors.Wrap(err, "failed to parse json file")
}
return file, nil
}
func WriteFileJSON(filePath string, data any) error {
contents, err := json.Marshal(data)
if err != nil {
return errors.Wrap(err, "failed to marshal data")
}
err = WriteFile(filePath, string(contents))
if err != nil {
return errors.Wrap(err, "failed to write file")
}
return nil
}
func ReadFileCSV(path string) (reader *csv.Reader, err error) {
csvFile, err := os.Open(path)
if err != nil {
return nil, err
}
reader = csv.NewReader(bufio.NewReader(csvFile))
return
}
func WriteFileCSV(filePath string, rows [][]string) error {
f, err := os.Create(filePath)
if err != nil {
return errors.Wrapf(err, "failed create file '%s'", filePath)
}
w := csv.NewWriter(f)
if err = w.WriteAll(rows); err != nil {
return errors.Wrap(err, "failed to write to file")
}
err = f.Close()
if err != nil {
return errors.Wrapf(err, "failed to close file '%s'", filePath)
}
return nil
}
type CSVRowCallback func(line []string, eof bool) error
func HandleCSVRows(path string, skipHeaderRow bool, breakOnEOF bool, callback CSVRowCallback) error {
reader, err := ReadFileCSV(path)
if err != nil {
return err
}
eof := false
for i := 0; true; i++ {
line, err := reader.Read()
if skipHeaderRow && i == 0 {
continue
}
if err == io.EOF {
if breakOnEOF {
break
} else {
eof = true
}
} else if err != nil {
return err
}
err = callback(line, eof)
if err != nil {
return err
}
if eof {
break
}
}
return nil
}