/
main.go
76 lines (64 loc) · 1.67 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
package main
import (
"bytes"
"fmt"
"go/parser"
"go/token"
"log"
"os"
"github.com/spf13/pflag"
"golang.org/x/tools/imports"
)
var (
buildString string
)
func main() {
fg := pflag.NewFlagSet("binserde", pflag.ExitOnError)
fg.Usage = func() {
fmt.Println(fg.FlagUsages())
os.Exit(1)
}
pkg := fg.String("pkg", "main", "Package to be given for the generated code")
dir := fg.String("dir", ".", `Path of the directory for finding source files with structs.`)
dest := fg.String("file", "", "Destination File")
endianess := fg.String("endianess", "big", "Endianess")
version := fg.Bool("version", false, "Version")
fg.Parse(os.Args[1:])
if *version {
fmt.Println(buildString)
os.Exit(0)
}
fs, err := initFileSystem()
if err != nil {
log.Fatalf("error while getting template for generating code: %v", err)
}
fset := token.NewFileSet()
pkgs, err := parser.ParseDir(fset, *dir, nil, parser.ParseComments)
if err != nil {
log.Fatalf("Couldn't parse directory: %v", err)
}
sts, err := parseNode(pkgs[*pkg])
if err != nil {
log.Fatalf("error while parsing: %v", err)
}
code := bytes.NewBuffer([]byte{})
if err := generateCode(code, fs, *pkg, sts, *endianess); err != nil {
log.Fatalf("error while generating code: %v", err)
}
fPath := *dest
if fPath == "" {
fPath = fmt.Sprintf("%s_binserde_gen.go", *pkg)
}
fmted, err := imports.Process(fPath, code.Bytes(), nil)
if err != nil {
log.Fatalf("error while formatting code: %v", err)
}
f, err := os.Create(fPath)
if err != nil {
log.Printf("error while creating file: %v\n", err)
}
defer f.Close()
if _, err := f.Write(fmted); err != nil {
log.Fatalf("error while storing the file: %v", err)
}
}