...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package codes
16
17 import (
18 "encoding/json"
19 "fmt"
20 "strconv"
21 )
22
23 const (
24
25 Unset Code = 0
26
27
28
29
30
31
32 Error Code = 1
33
34
35
36
37
38
39
40 Ok Code = 2
41
42 maxCode = 3
43 )
44
45
46 type Code uint32
47
48 var codeToStr = map[Code]string{
49 Unset: "Unset",
50 Error: "Error",
51 Ok: "Ok",
52 }
53
54 var strToCode = map[string]Code{
55 `"Unset"`: Unset,
56 `"Error"`: Error,
57 `"Ok"`: Ok,
58 }
59
60
61 func (c Code) String() string {
62 return codeToStr[c]
63 }
64
65
66
67
68
69 func (c *Code) UnmarshalJSON(b []byte) error {
70
71
72
73 if string(b) == "null" {
74 return nil
75 }
76 if c == nil {
77 return fmt.Errorf("nil receiver passed to UnmarshalJSON")
78 }
79
80 var x interface{}
81 if err := json.Unmarshal(b, &x); err != nil {
82 return err
83 }
84 switch x.(type) {
85 case string:
86 if jc, ok := strToCode[string(b)]; ok {
87 *c = jc
88 return nil
89 }
90 return fmt.Errorf("invalid code: %q", string(b))
91 case float64:
92 if ci, err := strconv.ParseUint(string(b), 10, 32); err == nil {
93 if ci >= maxCode {
94 return fmt.Errorf("invalid code: %q", ci)
95 }
96
97 *c = Code(ci)
98 return nil
99 }
100 return fmt.Errorf("invalid code: %q", string(b))
101 default:
102 return fmt.Errorf("invalid code: %q", string(b))
103 }
104 }
105
106
107 func (c *Code) MarshalJSON() ([]byte, error) {
108 if c == nil {
109 return []byte("null"), nil
110 }
111 str, ok := codeToStr[*c]
112 if !ok {
113 return nil, fmt.Errorf("invalid code: %d", *c)
114 }
115 return []byte(fmt.Sprintf("%q", str)), nil
116 }
117
View as plain text