Files
learngo/27-functional-programming/log-parser-exp/report.go

69 lines
1.1 KiB
Go
Raw Normal View History

package main
type (
2019-08-06 03:32:24 +03:00
inputFunc func() ([]result, error)
outputFunc func([]result) error
)
type report struct {
2019-08-06 03:32:24 +03:00
input inputFunc
filter filterFunc
group groupFunc
output outputFunc
}
func newReport() *report {
return &report{
2019-08-06 01:42:59 +03:00
filter: noopFilter,
}
}
2019-08-06 03:32:24 +03:00
func (r *report) from(fn inputFunc) *report {
r.input = fn
return r
}
2019-08-06 03:32:24 +03:00
func (r *report) to(fn outputFunc) *report {
r.output = fn
return r
}
func (r *report) filterBy(fn filterFunc) *report {
2019-08-06 01:42:59 +03:00
r.filter = fn
return r
}
func (r *report) groupBy(fn groupFunc) *report {
2019-08-06 01:42:59 +03:00
r.group = fn
return r
}
2019-08-06 03:32:24 +03:00
func (r *report) start() ([]result, error) {
if r.input == nil {
panic("report input cannot be nil")
}
2019-08-06 03:32:24 +03:00
results, err := r.input()
if err != nil {
return nil, err
}
2019-08-06 01:42:59 +03:00
// noop if filter is nil
results = filterBy(results, r.filter)
2019-08-06 01:42:59 +03:00
// group func is more tricky
// you don't want to create an unnecessary map
2019-08-06 01:42:59 +03:00
if r.group != nil {
results = groupBy(results, r.group)
}
2019-08-06 01:42:59 +03:00
// TODO: prefer: noop writer
2019-08-06 03:32:24 +03:00
if r.output != nil {
if err := r.output(results); err != nil {
return nil, err
}
}
return results, nil
}