/
write.go
105 lines (88 loc) · 2.43 KB
/
write.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
package nop
import (
"errors"
"log"
"net/url"
"time"
"github.com/pcelvng/task-tools/file/stat"
)
// MockWriteMode can be set in order to
// mock various return scenarios.
//
// MockWriteMode can be set directly on module
// or through the NewWriter initializer. The MockWriteMode
// value is the string value right after 'nop://'.
//
// Example Initializer Paths:
// "nop://init_err/" - MockWriteMode is set as 'init_err'
// "nop://err" - MockWriteMode is set as 'err'
// "nop://write_err/other/fake/path.txt" - MockWriteMode is set as 'write_err'
//
// Supported Values:
// - "init_err" - returns err on NewWriter
// - "err" - every method than can, returns an error
// - "write_err" - returns err on Writer.Write() call.
// - "writeline_err" - returns err on Writer.WriteLine() call.
// - "abort_err" - returns err on Writer.Abort() call.
// - "close_err" - returns non-nil error on Writer.Close() call.
//var MockWriteMode string
func NewWriter(pth string) (*Writer, error) {
sts := stat.New()
sts.SetPath(pth)
w := &Writer{
sts: sts,
}
// set mock write mode
// Note: the parsed write mode value
// will over-write pre-existing value.
// Manually set MockWriteMode values
// may need to be set after initialization.
mockWriteMode, err := url.Parse(pth)
if err != nil {
log.Println(err)
}
if mockWriteMode != nil {
w.MockWriteMode = mockWriteMode.Host
}
if w.MockWriteMode == "init_err" {
return nil, errors.New(w.MockWriteMode)
}
return w, nil
}
// Writer is a no-operation writer useful for testing.
type Writer struct {
sts stat.Stats
MockWriteMode string
}
func (w *Writer) Write(p []byte) (n int, err error) {
if w.MockWriteMode == "write_err" || w.MockWriteMode == "err" {
return 0, errors.New(w.MockWriteMode)
}
w.sts.AddBytes(int64(len(p)))
return len(p), nil
}
func (w *Writer) WriteLine(ln []byte) (err error) {
if w.MockWriteMode == "writeline_err" || w.MockWriteMode == "err" {
return errors.New(w.MockWriteMode)
}
w.sts.AddBytes(int64(len(ln) + 1))
w.sts.AddLine()
return nil
}
func (w *Writer) Stats() stat.Stats {
return w.sts.Clone()
}
func (w *Writer) Abort() error {
if w.MockWriteMode == "abort_err" || w.MockWriteMode == "err" {
return errors.New(w.MockWriteMode)
}
return nil
}
func (w *Writer) Close() error {
if w.MockWriteMode == "close_err" || w.MockWriteMode == "err" {
return errors.New(w.MockWriteMode)
}
w.sts.SetSize(w.sts.ByteCnt)
w.sts.SetCreated(time.Now())
return nil
}