Skip to content

Instantly share code, notes, and snippets.

@rjeczalik
Last active September 11, 2015 12:17
Show Gist options
  • Save rjeczalik/a59d2b9bd964db928ffc to your computer and use it in GitHub Desktop.
Save rjeczalik/a59d2b9bd964db928ffc to your computer and use it in GitHub Desktop.
package main
import (
"encoding/json"
"flag"
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"text/template"
)
var format = flag.String("f", "{{json .}}", "Format JSON with the given text/template.")
var input = flag.String("i", "-", "Input file; reads from stdin by default.")
func die(v interface{}) {
fmt.Fprintln(os.Stderr, v)
os.Exit(1)
}
func isStdin() bool {
stat, err := os.Stdin.Stat()
if err != nil {
return false
}
return stat.Mode()&os.ModeCharDevice == 0
}
var funcs = template.FuncMap{
"json": func(v interface{}) (string, error) {
p, err := json.MarshalIndent(v, "", "\t")
if err != nil {
return "", err
}
return string(p), nil
},
"base": func(s string) string {
return filepath.Base(s)
},
"dir": func(s string) string {
return filepath.Dir(s)
},
}
func parse() (*template.Template, io.ReadCloser) {
flag.Parse()
if *format == "" {
die("empty value passed for -f")
}
tmpl, err := template.New("gojq").Funcs(funcs).Parse(*format)
if err != nil {
die(err)
}
switch *input {
case "":
die("empty value passed for -i")
case "-":
if !isStdin() {
die("no data on stdin")
}
return tmpl, ioutil.NopCloser(os.Stdin)
}
f, err := os.Open(*input)
if err != nil {
die(err)
}
return tmpl, f
}
func main() {
var m interface{}
tmpl, rc := parse()
defer rc.Close()
if err := json.NewDecoder(rc).Decode(&m); err != nil {
die(err)
}
if err := tmpl.Execute(os.Stdout, m); err != nil {
die(err)
}
fmt.Println()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment