...
1
2
3 package optional
4
5 import (
6 "fmt"
7
8 "github.com/mailru/easyjson/jlexer"
9 "github.com/mailru/easyjson/jwriter"
10 )
11
12
13 type A int
14
15
16 type Optional struct {
17 V A
18 Defined bool
19 }
20
21
22 func OOptional(v A) Optional {
23 return Optional{V: v, Defined: true}
24 }
25
26
27 func (v Optional) Get(deflt A) A {
28 if !v.Defined {
29 return deflt
30 }
31 return v.V
32 }
33
34
35 func (v Optional) MarshalEasyJSON(w *jwriter.Writer) {
36 if v.Defined {
37 w.Optional(v.V)
38 } else {
39 w.RawString("null")
40 }
41 }
42
43
44 func (v *Optional) UnmarshalEasyJSON(l *jlexer.Lexer) {
45 if l.IsNull() {
46 l.Skip()
47 *v = Optional{}
48 } else {
49 v.V = l.Optional()
50 v.Defined = true
51 }
52 }
53
54
55 func (v Optional) MarshalJSON() ([]byte, error) {
56 w := jwriter.Writer{}
57 v.MarshalEasyJSON(&w)
58 return w.Buffer.BuildBytes(), w.Error
59 }
60
61
62 func (v *Optional) UnmarshalJSON(data []byte) error {
63 l := jlexer.Lexer{Data: data}
64 v.UnmarshalEasyJSON(&l)
65 return l.Error()
66 }
67
68
69
70 func (v Optional) IsDefined() bool {
71 return v.Defined
72 }
73
74
75 func (v Optional) String() string {
76 if !v.Defined {
77 return "<undefined>"
78 }
79 return fmt.Sprint(v.V)
80 }
81
View as plain text