/
xj2go.go
118 lines (99 loc) · 2.36 KB
/
xj2go.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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package xj2go
import (
"bytes"
"encoding/xml"
"log"
)
// XJ define xj2go struct
type XJ struct {
// xml or json file
Filepath string
// the pkg name for struct
Pkgname string
// the root name for json bytes
Rootname string
}
// New return a xj2go instance
func New(filepath, pkgname, rootname string) *XJ {
return &XJ{
Filepath: filepath,
Pkgname: pkgname,
Rootname: rootname,
}
}
// XMLToGo convert xml to go struct, then write this struct to a go file
func (xj *XJ) XMLToGo() error {
filename, err := checkFile(xj.Filepath, xj.Pkgname)
if err != nil {
log.Fatal(err)
return err
}
nodes, err := xmlToLeafNodes(xj.Filepath)
if err != nil {
log.Fatal(err)
return err
}
strcts := leafNodesToStrcts("xml", nodes)
return writeStruct(filename, xj.Pkgname, strcts)
}
// XMLBytesToGo convert xml bytes to struct, then the struct will be writed to ./{pkg}/{filename}.go
func XMLBytesToGo(filename, pkgname string, b *[]byte) error {
filename, err := checkFile(filename, pkgname)
if err != nil {
log.Fatal(err)
return err
}
r := bytes.NewReader(*b)
m, err := decodeXML(xml.NewDecoder(r), "", nil)
if err != nil {
log.Fatal(err)
return err
}
nodes, err := leafNodes(m)
if err != nil {
log.Fatal(err)
return err
}
strcts := leafNodesToStrcts("xml", nodes)
return writeStruct(filename, pkgname, strcts)
}
// JSONToGo convert json to go struct, then write this struct to a go file
func (xj *XJ) JSONToGo() error {
filename, err := checkFile(xj.Filepath, xj.Pkgname)
if err != nil {
log.Fatal(err)
return err
}
nodes, err := jsonToLeafNodes(xj.Rootname, xj.Filepath)
if err != nil {
log.Fatal(err)
return err
}
strcts := leafNodesToStrcts("json", nodes)
return writeStruct(filename, xj.Pkgname, strcts)
}
// JSONBytesToGo convert json bytes to struct, then the struct will be writed to ./{pkg}/{filename}.go
func JSONBytesToGo(filename, pkgname, rootname string, b *[]byte) error {
filename, err := checkFile(filename, pkgname)
if err != nil {
log.Fatal(err)
return err
}
m, err := jsonBytesToMap(pkgname, rootname, b)
if err != nil {
log.Fatal(err)
return err
}
ns, err := leafNodes(m)
if err != nil {
log.Fatal(err)
return err
}
nodes, err := reLeafNodes(ns, rootname)
if err != nil {
log.Fatal(err)
return err
}
strcts := leafNodesToStrcts("json", nodes)
return writeStruct(filename, pkgname, strcts)
}