github.com/kubernetes-incubator/kube-aws@v0.16.4/filereader/jsontemplate/jsontemplate.go (about)

     1  package jsontemplate
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/json"
     6  	"fmt"
     7  	"github.com/kubernetes-incubator/kube-aws/filereader/texttemplate"
     8  )
     9  
    10  func GetBytes(filename string, data interface{}, prettyPrint bool) ([]byte, error) {
    11  	rendered, err := texttemplate.GetString(filename, data)
    12  	if err != nil {
    13  		return nil, err
    14  	}
    15  
    16  	//Use unmarshal function to do syntax validation
    17  	renderedBytes := []byte(rendered)
    18  	var jsonHolder map[string]interface{}
    19  	if err := json.Unmarshal(renderedBytes, &jsonHolder); err != nil {
    20  		syntaxError, ok := err.(*json.SyntaxError)
    21  		if ok {
    22  			contextString := getContextString(renderedBytes, int(syntaxError.Offset), 10)
    23  			return nil, fmt.Errorf("%v:\njson syntax error (offset=%d), in this region:\n-------\n%s\n-------\n", err, syntaxError.Offset, contextString)
    24  		}
    25  		return nil, err
    26  	}
    27  
    28  	// minify or pretty print JSON
    29  	var buff bytes.Buffer
    30  	err = nil
    31  	if prettyPrint {
    32  		err = json.Indent(&buff, renderedBytes, "", "  ")
    33  	} else {
    34  		err = json.Compact(&buff, renderedBytes)
    35  	}
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  
    40  	return buff.Bytes(), nil
    41  }
    42  
    43  func GetString(filename string, data interface{}, prettyPrint bool) (string, error) {
    44  	bytes, err := GetBytes(filename, data, prettyPrint)
    45  
    46  	if err != nil {
    47  		return "", err
    48  	}
    49  
    50  	return string(bytes), nil
    51  }
    52  
    53  func getContextString(buf []byte, offset, lineCount int) string {
    54  	// Prevent index out of range errors when we meet errors at the very end of json
    55  	bufsize := len(buf)
    56  	if offset >= bufsize {
    57  		if bufsize > 0 {
    58  			offset = bufsize - 1
    59  		} else {
    60  			offset = 0
    61  		}
    62  	}
    63  
    64  	linesSeen := 0
    65  	var leftLimit int
    66  	for leftLimit = offset; leftLimit > 0 && linesSeen <= lineCount; leftLimit-- {
    67  		if buf[leftLimit] == '\n' {
    68  			linesSeen++
    69  		}
    70  	}
    71  
    72  	linesSeen = 0
    73  	var rightLimit int
    74  	for rightLimit = offset + 1; rightLimit < len(buf) && linesSeen <= lineCount; rightLimit++ {
    75  		if buf[rightLimit] == '\n' {
    76  			linesSeen++
    77  		}
    78  	}
    79  
    80  	return string(buf[leftLimit:rightLimit])
    81  }