You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wuzz/formatter/json.go

56 lines
1.3 KiB
Go

package formatter
import (
"bytes"
"errors"
"io"
"github.com/nwidger/jsoncolor"
"github.com/tidwall/gjson"
)
type jsonFormatter struct {
parsedBody gjson.Result
TextFormatter
}
func (f *jsonFormatter) Format(writer io.Writer, data []byte) error {
jsonFormatter := jsoncolor.NewFormatter()
jsonFormatter.Indent = " "
buf := bytes.NewBuffer(make([]byte, 0, len(data)))
err := jsonFormatter.Format(buf, data)
if err == nil {
writer.Write(buf.Bytes())
return nil
}
return errors.New("json formatter error")
}
func (f *jsonFormatter) Title() string {
return "[json]"
}
func (f *jsonFormatter) Search(q string, body []byte) ([]string, error) {
if q != "" {
if f.parsedBody.Type != gjson.JSON {
f.parsedBody = gjson.ParseBytes(body)
}
searchResult := f.parsedBody.Get(q)
if searchResult.Type == gjson.Null {
return nil, errors.New("Invalid gjson query or no results found")
}
if searchResult.Type != gjson.JSON {
return []string{searchResult.String()}, nil
}
body = []byte(searchResult.String())
}
jsonFormatter := jsoncolor.NewFormatter()
jsonFormatter.Indent = " "
buf := bytes.NewBuffer(make([]byte, 0, len(body)))
err := jsonFormatter.Format(buf, body)
if err != nil {
return nil, errors.New("Invalid results")
}
return []string{string(buf.Bytes())}, nil
}