-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathmakestatic.go
80 lines (70 loc) · 2.1 KB
/
makestatic.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
// Copyright 2018 <chaishushan{AT}gmail.com>. All rights reserved.
// Use of this source code is governed by a Apache
// license that can be found in the LICENSE file.
// +build ignore
// Command makestatic reads a set of files and writes a Go source file to "static.go"
// that declares a map of string constants containing contents of the input files.
// It is intended to be invoked via "go generate" (directive in "gen.go").
package main
import (
"bytes"
"fmt"
"go/format"
"io/ioutil"
"os"
"path/filepath"
"unicode/utf8"
)
var files = []string{
"pbgo.proto",
}
func main() {
if err := makestatic(); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
func makestatic() error {
f, err := os.Create("static_proto_files.go")
if err != nil {
return err
}
defer f.Close()
buf := new(bytes.Buffer)
fmt.Fprintf(buf, "%v\n\n%v\n\npackage pbgo\n\n", license, warning)
fmt.Fprintf(buf, "var ProtoFiles = map[string]string{\n")
for _, fn := range files {
b, err := ioutil.ReadFile(fn)
if err != nil {
return err
}
fmt.Fprintf(buf, "\t%q: ", filepath.Base(fn))
if utf8.Valid(b) {
fmt.Fprintf(buf, "`%s`", sanitize(b))
} else {
fmt.Fprintf(buf, "%q", b)
}
fmt.Fprintln(buf, ",\n")
}
fmt.Fprintln(buf, "}")
fmtbuf, err := format.Source(buf.Bytes())
if err != nil {
return err
}
return ioutil.WriteFile("static_proto_files.go", fmtbuf, 0666)
}
// sanitize prepares a valid UTF-8 string as a raw string constant.
func sanitize(b []byte) []byte {
// Replace ` with `+"`"+`
b = bytes.Replace(b, []byte("`"), []byte("`+\"`\"+`"), -1)
// Replace BOM with `+"\xEF\xBB\xBF"+`
// (A BOM is valid UTF-8 but not permitted in Go source files.
// I wouldn't bother handling this, but for some insane reason
// jquery.js has a BOM somewhere in the middle.)
return bytes.Replace(b, []byte("\xEF\xBB\xBF"), []byte("`+\"\\xEF\\xBB\\xBF\"+`"), -1)
}
const warning = `// Code generated by "makestatic"; DO NOT EDIT.`
var license = `// Copyright 2018 <chaishushan{AT}gmail.com>. All rights reserved.
// Use of this source code is governed by a Apache
// license that can be found in the LICENSE file.
`