diff --git a/cmd/acp/main.go b/cmd/acp/main.go index 456bc77..251a5a1 100644 --- a/cmd/acp/main.go +++ b/cmd/acp/main.go @@ -3,14 +3,10 @@ package main import ( "context" "flag" - "fmt" "os" "os/signal" - "unsafe" "github.com/abc950309/acp" - jsoniter "github.com/json-iterator/go" - "github.com/modern-go/reflect2" "github.com/sirupsen/logrus" ) @@ -113,14 +109,7 @@ func main() { } defer r.Close() - var buf []byte - if *reportIndent { - buf, _ = reportJSON.MarshalIndent(report, "", "\t") - } else { - buf, _ = reportJSON.Marshal(report) - } - - r.Write(buf) + r.Write([]byte(report.ToJSONString(*reportIndent))) }() } @@ -131,40 +120,3 @@ func main() { c.Wait() } - -var ( - reportJSON jsoniter.API -) - -type errValCoder struct{} - -func (*errValCoder) IsEmpty(ptr unsafe.Pointer) bool { - val := (*error)(ptr) - return *val == nil -} - -func (*errValCoder) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) { - val := (*error)(ptr) - stream.WriteString((*val).Error()) -} - -func (*errValCoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) { - val := (*error)(ptr) - *val = fmt.Errorf(iter.ReadString()) -} - -func init() { - reportJSON = jsoniter.Config{ - EscapeHTML: true, - SortMapKeys: true, - ValidateJsonRawMessage: true, - }.Froze() - - var emptyErr error - reportJSON.RegisterExtension(jsoniter.EncoderExtension{ - reflect2.TypeOf(emptyErr): &errValCoder{}, - }) - reportJSON.RegisterExtension(jsoniter.DecoderExtension{ - reflect2.TypeOf(emptyErr): &errValCoder{}, - }) -} diff --git a/report.go b/report.go index 1953f6b..a40f627 100644 --- a/report.go +++ b/report.go @@ -1,8 +1,13 @@ package acp import ( + "fmt" "path" "sync" + "unsafe" + + jsoniter "github.com/json-iterator/go" + "github.com/modern-go/reflect2" ) type ReportGetter func() *Report @@ -35,10 +40,9 @@ func NewReportGetter() (EventHandler, ReportGetter) { for _, j := range jobs { jobsCopyed = append(jobsCopyed, j) } + errorsCopyed := make([]*Error, 0, len(jobs)) - for _, e := range errors { - errorsCopyed = append(errorsCopyed, e) - } + errorsCopyed = append(errorsCopyed, errors...) return &Report{ Jobs: jobsCopyed, @@ -52,3 +56,50 @@ type Report struct { Jobs []*Job `json:"files,omitempty"` Errors []*Error `json:"errors,omitempty"` } + +func (r *Report) ToJSONString(indent bool) string { + if indent { + buf, _ := reportJSON.MarshalIndent(r, "", "\t") + return string(buf) + } + + buf, _ := reportJSON.Marshal(r) + return string(buf) +} + +var ( + reportJSON jsoniter.API +) + +type errValCoder struct{} + +func (*errValCoder) IsEmpty(ptr unsafe.Pointer) bool { + val := (*error)(ptr) + return *val == nil +} + +func (*errValCoder) Encode(ptr unsafe.Pointer, stream *jsoniter.Stream) { + val := (*error)(ptr) + stream.WriteString((*val).Error()) +} + +func (*errValCoder) Decode(ptr unsafe.Pointer, iter *jsoniter.Iterator) { + val := (*error)(ptr) + *val = fmt.Errorf(iter.ReadString()) +} + +func init() { + reportJSON = jsoniter.Config{ + EscapeHTML: true, + SortMapKeys: true, + ValidateJsonRawMessage: true, + }.Froze() + + var emptyErr error + reportJSON.RegisterExtension(jsoniter.EncoderExtension{ + reflect2.TypeOf(emptyErr): &errValCoder{}, + }) + reportJSON.RegisterExtension(jsoniter.DecoderExtension{ + reflect2.TypeOf(emptyErr): &errValCoder{}, + }) +}