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 }