Skip to content

Commit

Permalink
remove if nil { new(T) } initializers + first test (Price)
Browse files Browse the repository at this point in the history
+ stretchr/testify dependency
  • Loading branch information
marz619 committed Feb 1, 2021
1 parent db87781 commit aade41f
Show file tree
Hide file tree
Showing 15 changed files with 124 additions and 121 deletions.
8 changes: 0 additions & 8 deletions fields/coordinates.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,6 @@ var ErrLatitude = errors.New("Latitude must in range [-90.0, 90.0]")

// UnmarshalJSON implements json.Unmarshaler interface
func (l *Latitude) UnmarshalJSON(data []byte) error {
if l == nil {
l = new(Latitude)
}

f, err := unmarshalToFloat64(data)
if err != nil {
return err
Expand All @@ -35,10 +31,6 @@ var ErrLongitude = errors.New("Longitude must in range [-180.0, 180.0]")

// UnmarshalJSON implements json.Unmarshaler interface
func (l *Longitude) UnmarshalJSON(data []byte) error {
if l == nil {
l = new(Longitude)
}

f, err := unmarshalToFloat64(data)
if err != nil {
return err
Expand Down
4 changes: 0 additions & 4 deletions fields/currency.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@ type Currency struct {

// UnmarshalJSON implements json.Unmarshaler interface
func (c *Currency) UnmarshalJSON(data []byte) error {
if c == nil {
c = new(Currency)
}

s, err := unmarshalToString(data)
if err != nil {
return err
Expand Down
4 changes: 0 additions & 4 deletions fields/email.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@ type Email struct {

// UnmarshalJSON implements json.Unmarshaler interface
func (e *Email) UnmarshalJSON(data []byte) error {
if e == nil {
e = new(Email)
}

s, err := unmarshalToString(data)
if err != nil {
return err
Expand Down
16 changes: 0 additions & 16 deletions fields/enums.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,6 @@ var ErrUnknownDayOfWeek = errors.New("unknown day")

// UnmarshalJSON implements json.Unmarshaler interface
func (d *DayOfWeek) UnmarshalJSON(data []byte) error {
if d == nil {
d = new(DayOfWeek)
}

s, err := unmarshalToString(data)
if err != nil {
return err
Expand Down Expand Up @@ -108,10 +104,6 @@ var ErrUnknownMobile = errors.New("unknown mobile")

// UnmarshalJSON implements json.Unmarshaler interface
func (m *Mobile) UnmarshalJSON(data []byte) error {
if m == nil {
m = new(Mobile)
}

s, err := unmarshalToString(data)
if err != nil {
return err
Expand Down Expand Up @@ -148,10 +140,6 @@ var ErrUnknownRentalMethod = errors.New("unknown rental method")

// UnmarshalJSON implements json.Unmarshaler interface
func (r *RentalMethod) UnmarshalJSON(data []byte) error {
if r == nil {
r = new(RentalMethod)
}

s, err := unmarshalToString(data)
if err != nil {
return err
Expand Down Expand Up @@ -182,10 +170,6 @@ var ErrUnknownUserType = errors.New("unknown user type")

// UnmarshalJSON implements json.Unmarshaler interface
func (u *UserType) UnmarshalJSON(data []byte) error {
if u == nil {
u = new(UserType)
}

s, err := unmarshalToString(data)
if err != nil {
return err
Expand Down
4 changes: 0 additions & 4 deletions fields/language.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@ type Language struct {

// UnmarshalJSON implements json.Unmarshaler interface
func (l *Language) UnmarshalJSON(data []byte) error {
if l == nil {
l = new(Language)
}

s, err := unmarshalToString(data)
if err != nil {
return err
Expand Down
12 changes: 2 additions & 10 deletions fields/numbers.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@ var ErrNonNegativeInt = errors.New("NonNegativeInt must have value >= 0")

// UnmarshalJSON implements json.Unmarshaler interface
func (n *NonNegativeInt) UnmarshalJSON(data []byte) error {
if n == nil {
n = new(NonNegativeInt)
}

i, err := unmarshalToInt(data)
if err != nil {
return err
Expand All @@ -42,10 +38,6 @@ var ErrNonNegativeFloat = errors.New("NonNegativeFloat must have value >= 0.0")

// UnmarshalJSON implements json.Unmarshaler interface
func (n *NonNegativeFloat) UnmarshalJSON(data []byte) error {
if n == nil {
n = new(NonNegativeFloat)
}

f, err := unmarshalToFloat64(data)
if err != nil {
return err
Expand All @@ -59,6 +51,6 @@ func (n *NonNegativeFloat) UnmarshalJSON(data []byte) error {
return nil
}

func (n *NonNegativeFloat) String() string {
return strconv.FormatFloat(float64(*n), 'g', -1, 64)
func (n NonNegativeFloat) String() string {
return strconv.FormatFloat(float64(n), 'g', -1, 64)
}
39 changes: 17 additions & 22 deletions fields/price.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package fields

import (
"errors"
"reflect"
"strconv"
)

// Price ...
Expand All @@ -13,48 +13,43 @@ type Price struct {
n NonNegativeFloat
}

// ErrInvalidPriceType ...
var ErrInvalidPriceType = errors.New("price must be string or float")

// UnmarshalJSON implements json.Unmarshaler interface
func (p *Price) UnmarshalJSON(data []byte) error {
if p == nil {
p = new(Price)
v, err := unmarshal(data)
if err != nil {
return err
}

switch data[0] {
switch v.(type) {
default:
return ErrInvalidPriceType
case float64:
p.k = reflect.Float64

n, err := unmarshalToNonNegativeFloat(data)
p.n, err = unmarshalToNonNegativeFloat(data)
if err != nil {
return err
}

p.n = *n
p.s = n.String()
case '"':
p.s = p.n.String()
case string:
p.k = reflect.String

s, err := unmarshalToString(data)
p.s = v.(string)
p.n, err = unmarshalToNonNegativeFloat([]byte(p.s))
if err != nil {
return err
}

f, err := strconv.ParseFloat(s, 64)
if err != nil {
return err
}

p.s = s
p.n = NonNegativeFloat(f)
}

return nil
}

// Float64 ...
func (p *Price) Float64() float64 {
func (p Price) Float64() float64 {
return float64(p.n)
}

func (p *Price) String() string {
func (p Price) String() string {
return p.s
}
76 changes: 64 additions & 12 deletions fields/tests/price_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,75 @@ package tests
import (
"encoding/json"
"testing"
)

// PriceStruct ...
type PriceStruct struct {
Price fields.Price `json:"price"`
}
"github.com/marz619/gbfs-go/fields"
"github.com/stretchr/testify/assert"
)

// TestPriceUnmarshalJSON ...
func TestPriceUnmarshalJSON(t *testing.T) {
raw := []byte(`{"price":"3.14"`)
// standalone
for _, tc := range []struct {
raw []byte
expS string
expF float64
}{
{[]byte(`"3.14159"`), "3.14159", 3.14159},
{[]byte(`3.14159`), "3.14159", 3.14159},
} {
t.Run("field: "+string(tc.raw), func(t *testing.T) {
var p fields.Price
assert.NoError(t, json.Unmarshal(tc.raw, &p))
assert.Equal(t, tc.expS, p.String())
assert.Equal(t, tc.expF, p.Float64())
})
}

var ps PriceStruct
err := json.Unmarshal(raw, &ps)
if err != nil {
t.Error(err)
// simple json struct
type S struct {
P fields.Price `json:"price"`
}

p := ps.Price
if p.String() !=
for _, tc := range []struct {
raw []byte
expS string
expF float64
}{
{[]byte(`{"price":"2.71828"}`), "2.71828", 2.71828},
{[]byte(`{"price":2.71828}`), "2.71828", 2.71828},
} {
t.Run("struct with value: "+string(tc.raw), func(t *testing.T) {
var s S
assert.NoError(t, json.Unmarshal(tc.raw, &s))
assert.Equal(t, tc.expS, s.P.String())
assert.Equal(t, tc.expF, s.P.Float64())
})
}

// simple json struct with pointer
type U struct {
P *fields.Price `json:"price"`
}

for _, tc := range []struct {
raw []byte
expS string
expF float64
isNil bool
}{
{[]byte(`{"price":"1.61803"}`), "1.61803", 1.61803, false},
{[]byte(`{"price":1.61803}`), "1.61803", 1.61803, false},
{[]byte(`{}`), "", 0.0, true},
} {
t.Run("struct with pointer: "+string(tc.raw), func(t *testing.T) {
var u U
assert.NoError(t, json.Unmarshal(tc.raw, &u))
if !tc.isNil {
assert.Equal(t, tc.expS, u.P.String())
assert.Equal(t, tc.expF, u.P.Float64())
} else {
assert.Nil(t, u.P)
}
})
}
}
28 changes: 6 additions & 22 deletions fields/time.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@ const dateFmt = "2006-01-02"

// UnmarshalJSON implements json.Unmarshaler interface
func (d *Date) UnmarshalJSON(data []byte) error {
if d == nil {
d = new(Date)
}

s, err := unmarshalToString(data)
if err != nil {
return err
Expand All @@ -46,11 +42,11 @@ func (d *Day) UnmarshalJSON(data []byte) error {
return err
}

if *n < 1 || *n > 31 {
if n < 1 || n > 31 {
return ErrInvalidDay
}

*d = Day(*n)
*d = Day(n)
return nil
}

Expand All @@ -67,11 +63,11 @@ func (m *Month) UnmarshalJSON(data []byte) error {
return err
}

if *n < 1 || *n > 12 {
if n < 1 || n > 12 {
return ErrInvalidMonth
}

*m = Month(*n)
*m = Month(n)
return nil
}

Expand All @@ -88,11 +84,11 @@ func (y *Year) UnmarshalJSON(data []byte) error {
return err
}

if *n < 0 || *n > 9999 {
if n < 0 || n > 9999 {
return ErrInvalidYear
}

*y = Year(*n)
*y = Year(n)
return nil
}

Expand All @@ -106,10 +102,6 @@ const timeFmt = "15:04:05"

// UnmarshalJSON implements json.Unmarshaler interface
func (t *Time) UnmarshalJSON(data []byte) error {
if t == nil {
t = new(Time)
}

s, err := unmarshalToString(data)
if err != nil {
return err
Expand All @@ -134,10 +126,6 @@ type Timestamp struct {

// UnmarshalJSON implements json.Unmarshaler interface
func (t *Timestamp) UnmarshalJSON(data []byte) error {
if t == nil {
t = new(Timestamp)
}

i, err := unmarshalToInt(data)
if err != nil {
return err
Expand All @@ -158,10 +146,6 @@ type Timezone struct {

// UnmarshalJSON implements json.Unmarshaler interface
func (t *Timezone) UnmarshalJSON(data []byte) error {
if t == nil {
t = new(Timezone)
}

zone, err := unmarshalToString(data)
if err != nil {
return err
Expand Down
4 changes: 0 additions & 4 deletions fields/uri.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,6 @@ type URI struct {

// UnmarshalJSON implements json.Unmarshaler interface
func (u *URI) UnmarshalJSON(data []byte) (err error) {
if u == nil {
u = new(URI)
}

(*u).URL, err = unmarshalToURL(data)
return err
}
Loading

0 comments on commit aade41f

Please sign in to comment.