File tree Expand file tree Collapse file tree 3 files changed +92
-1
lines changed Expand file tree Collapse file tree 3 files changed +92
-1
lines changed Original file line number Diff line number Diff line change @@ -12,7 +12,7 @@ import (
1212//
1313// Gerrit API docs: https://gerrit-review.googlesource.com/Documentation/json.html#patchSet
1414type PatchSet struct {
15- Number string `json:"number"`
15+ Number Number `json:"number"`
1616 Revision string `json:"revision"`
1717 Parents []string `json:"parents"`
1818 Ref string `json:"ref"`
Original file line number Diff line number Diff line change 1+ package gerrit
2+
3+ import (
4+ "encoding/json"
5+ "errors"
6+ "strconv"
7+ )
8+
9+
10+ // Number is a string representing a number. This type is only used in cases
11+ // where the API being queried may return an inconsistent result.
12+ type Number string
13+
14+ // String returns the string representing the current number.
15+ func (n * Number ) String () string {
16+ return string (* n )
17+ }
18+
19+ // Int returns the current number as an integer
20+ func (n * Number ) Int () (int , error ) {
21+ return strconv .Atoi (n .String ())
22+ }
23+
24+ func (n * Number ) UnmarshalJSON (data []byte ) error {
25+ // `data` is a number represented as a string (ex. "5").
26+ var stringNumber string
27+ if err := json .Unmarshal (data , & stringNumber ); err == nil {
28+ * n = Number (stringNumber )
29+ return nil
30+ }
31+
32+ // `data` is a number represented as an integer (ex. 5). Here
33+ // we're using json.Unmarshal to convert bytes -> number which
34+ // we then convert to our own Number type.
35+ var number int
36+ if err := json .Unmarshal (data , & number ); err == nil {
37+ * n = Number (strconv .Itoa (number ))
38+ return nil
39+ }
40+ return errors .New ("Cannot convert data to number" )
41+ }
42+
Original file line number Diff line number Diff line change 1+ package gerrit_test
2+
3+ import (
4+ "encoding/json"
5+ "testing"
6+ "github.com/andygrunwald/go-gerrit"
7+ )
8+
9+ func TestTypesNumber_String (t * testing.T ) {
10+ number := gerrit .Number ("7" )
11+ if number .String () != "7" {
12+ t .Fatalf ("%s != 7" , number .String ())
13+ }
14+ }
15+
16+ func TestTypesNumber_Int (t * testing.T ) {
17+ number := gerrit .Number ("7" )
18+ integer , err := number .Int ()
19+ if err != nil {
20+ t .Fatal (err )
21+ }
22+ if integer != 7 {
23+ t .Fatalf ("%d != 7" , integer )
24+ }
25+ }
26+
27+ func TestTypesNumber_UnmarshalJSON_String (t * testing.T ) {
28+ var number gerrit.Number
29+ if err := json .Unmarshal ([]byte (`"7"` ), & number ); err != nil {
30+ t .Fatal (err )
31+ }
32+ if number .String () != "7" {
33+ t .Fatalf ("%s != 7" , number .String ())
34+ }
35+ }
36+
37+ func TestTypesNumber_UnmarshalJSON_Int (t * testing.T ) {
38+ var number gerrit.Number
39+ if err := json .Unmarshal ([]byte ("7" ), & number ); err != nil {
40+ t .Fatal (err )
41+ }
42+ integer , err := number .Int ()
43+ if err != nil {
44+ t .Fatal (err )
45+ }
46+ if integer != 7 {
47+ t .Fatalf ("%d != 7" , integer )
48+ }
49+ }
You can’t perform that action at this time.
0 commit comments