Skip to content

Commit 3b62a29

Browse files
committed
Make ResultCode a TextMarshaler/TextUnmarshaler.
1 parent 16a7d9c commit 3b62a29

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

result.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,30 @@ func (r ResultCode) String() string {
4545
}
4646
}
4747

48+
func (r ResultCode) MarshalText() ([]byte, error) {
49+
switch r {
50+
case None, Patchlevel, Minor, Major:
51+
return []byte(r.String()), nil
52+
}
53+
return nil, fmt.Errorf("unknown ResultCode value %d", r)
54+
}
55+
56+
func (r *ResultCode) UnmarshalText(text []byte) error {
57+
switch string(text) {
58+
case "None":
59+
*r = None
60+
case "Patchlevel":
61+
*r = Patchlevel
62+
case "Minor":
63+
*r = Minor
64+
case "Major":
65+
*r = Major
66+
default:
67+
return fmt.Errorf("unknown ResultCode value %q", text)
68+
}
69+
return nil
70+
}
71+
4872
type wrapped struct {
4973
r Result
5074
whyfmt string

result_test.go

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package modver
22

33
import (
44
"bytes"
5+
"encoding/json"
6+
"fmt"
57
"testing"
68
)
79

@@ -21,3 +23,52 @@ func TestPretty(t *testing.T) {
2123
t.Errorf("got %s, want %s", buf, want)
2224
}
2325
}
26+
27+
func TestMarshalResultCode(t *testing.T) {
28+
cases := []struct {
29+
rc ResultCode
30+
want string
31+
wantErr bool
32+
}{{
33+
rc: None,
34+
want: `"None"`,
35+
}, {
36+
rc: Patchlevel,
37+
want: `"Patchlevel"`,
38+
}, {
39+
rc: Minor,
40+
want: `"Minor"`,
41+
}, {
42+
rc: Major,
43+
want: `"Major"`,
44+
}, {
45+
rc: ResultCode(42),
46+
wantErr: true,
47+
}}
48+
49+
for i, tc := range cases {
50+
t.Run(fmt.Sprintf("case_%02d", i+1), func(t *testing.T) {
51+
got, err := json.Marshal(tc.rc)
52+
if err != nil && tc.wantErr {
53+
return
54+
}
55+
if err != nil {
56+
t.Fatal(err)
57+
}
58+
if tc.wantErr {
59+
t.Fatal("got no error but want one")
60+
}
61+
if string(got) != tc.want {
62+
t.Errorf("marshaling: got %s, want %s", string(got), tc.want)
63+
}
64+
65+
var rc ResultCode
66+
if err := json.Unmarshal(got, &rc); err != nil {
67+
t.Fatal(err)
68+
}
69+
if rc != tc.rc {
70+
t.Errorf("unmarshaling: got %v, want %v", rc, tc.rc)
71+
}
72+
})
73+
}
74+
}

0 commit comments

Comments
 (0)