github.com/abdfnx/gh-api@v0.0.0-20210414084727-f5432eec23b8/pkg/cmd/api/filter.go (about)

     1  package api
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io"
     7  	"io/ioutil"
     8  
     9  	"github.com/itchyny/gojq"
    10  )
    11  
    12  func filterJSON(w io.Writer, input io.Reader, queryStr string) error {
    13  	query, err := gojq.Parse(queryStr)
    14  	if err != nil {
    15  		return err
    16  	}
    17  
    18  	jsonData, err := ioutil.ReadAll(input)
    19  	if err != nil {
    20  		return err
    21  	}
    22  
    23  	var responseData interface{}
    24  	err = json.Unmarshal(jsonData, &responseData)
    25  	if err != nil {
    26  		return err
    27  	}
    28  
    29  	iter := query.Run(responseData)
    30  	for {
    31  		v, ok := iter.Next()
    32  		if !ok {
    33  			break
    34  		}
    35  		if err, isErr := v.(error); isErr {
    36  			return err
    37  		}
    38  		if text, e := jsonScalarToString(v); e == nil {
    39  			_, err := fmt.Fprintln(w, text)
    40  			if err != nil {
    41  				return err
    42  			}
    43  		} else {
    44  			var jsonFragment []byte
    45  			jsonFragment, err = json.Marshal(v)
    46  			if err != nil {
    47  				return err
    48  			}
    49  			_, err = w.Write(jsonFragment)
    50  			if err != nil {
    51  				return err
    52  			}
    53  			_, err = fmt.Fprint(w, "\n")
    54  			if err != nil {
    55  				return err
    56  			}
    57  		}
    58  	}
    59  
    60  	return nil
    61  }