-
Notifications
You must be signed in to change notification settings - Fork 0
/
types.go
123 lines (102 loc) · 2.38 KB
/
types.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
119
120
121
122
123
package packaging
import (
"encoding/xml"
"strconv"
"github.com/shopspring/decimal"
)
type BoolAttr int
func (b BoolAttr) Value() bool {
return b != 0
}
func NewBool(b bool) BoolAttr {
if b {
return BoolAttr(1)
}
return BoolAttr(0)
}
func (b BoolAttr) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
var err error
if b == 0 {
err = e.EncodeElement("0", start)
} else {
err = e.EncodeElement("1", start)
}
return err
}
func (b *BoolAttr) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
var s string
err := d.DecodeElement(&s, &start)
if err != nil {
return err
}
if s == "1" {
*b = 1
} else {
*b = 0
}
return nil
}
type OmitIntAttr int
func (i OmitIntAttr) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
if i == 0 {
return xml.Attr{}, nil
}
return xml.Attr{Name: name, Value: strconv.Itoa(int(i))}, nil
}
func (i OmitIntAttr) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if i == 0 {
return nil
}
return e.EncodeElement(int(i), start)
}
type OmitDecimalAttr decimal.Decimal
func (i OmitDecimalAttr) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
if i.Value().IsZero() {
return xml.Attr{}, nil
}
return xml.Attr{Name: name, Value: i.Value().String()}, nil
}
func (a OmitDecimalAttr) Value() decimal.Decimal {
return decimal.Decimal(a)
}
func NewOmitDecimal(v decimal.Decimal) OmitDecimalAttr {
if !v.IsZero() {
return OmitDecimalAttr(v)
}
return OmitDecimalAttr(decimal.Zero)
}
func (a OmitDecimalAttr) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
var err error
if a.Value().IsZero() {
err = e.EncodeElement("", start)
} else {
err = e.EncodeElement(a.Value().String(), start)
}
return err
}
type OmitUIntAttr uint
func (i OmitUIntAttr) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
if i == 0 {
return xml.Attr{}, nil
}
return xml.Attr{Name: name, Value: strconv.Itoa(int(i))}, nil
}
func (i OmitUIntAttr) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if i == 0 {
return nil
}
return e.EncodeElement(int(i), start)
}
type OmitUByteAttr uint8
func (i OmitUByteAttr) MarshalXMLAttr(name xml.Name) (xml.Attr, error) {
if i == 0 {
return xml.Attr{}, nil
}
return xml.Attr{Name: name, Value: strconv.Itoa(int(i))}, nil
}
func (i OmitUByteAttr) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
if i == 0 {
return nil
}
return e.EncodeElement(int(i), start)
}