/
main.go
83 lines (71 loc) · 1.6 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package main
import (
"bytes"
"flag"
"fmt"
"go/format"
"io/ioutil"
"os"
"strings"
"text/template"
)
var (
outputTemplate = template.Must(template.New("output").Funcs(template.FuncMap{
"printMultiLineString": printMultiLineString,
}).Parse(`// Code generated by github.com/twpayne/chezmoi/internal/cmd/generate-assets. DO NOT EDIT.
{{- if .Tags}}
// +build {{ .Tags }}
{{- end }}
package cmd
func init() {
{{- range $key, $value := .Assets }}
assets[{{ printf "%q" $key }}] = []byte("" +
{{ printMultiLineString $value }})
{{- end }}
}`))
output = flag.String("o", "/dev/stdout", "output")
trimPrefix = flag.String("trimprefix", "", "trim prefix")
tags = flag.String("tags", "", "tags")
)
func printMultiLineString(s []byte) string {
sb := &strings.Builder{}
for i, line := range bytes.Split(s, []byte{'\n'}) {
if i != 0 {
sb.WriteString(" +\n")
}
sb.WriteString(fmt.Sprintf("%q", append(line, '\n')))
}
return sb.String()
}
func run() error {
flag.Parse()
assets := make(map[string][]byte)
for _, arg := range flag.Args() {
var err error
assets[strings.TrimPrefix(arg, *trimPrefix)], err = ioutil.ReadFile(arg)
if err != nil {
return err
}
}
sb := &strings.Builder{}
if err := outputTemplate.Execute(sb, struct {
Tags string
Assets map[string][]byte
}{
Tags: *tags,
Assets: assets,
}); err != nil {
return err
}
formattedSource, err := format.Source([]byte(sb.String()))
if err != nil {
return err
}
return ioutil.WriteFile(*output, formattedSource, 0o666)
}
func main() {
if err := run(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}