Skip to content

Commit 10ec3b5

Browse files
authored
❇️ Utilities to deal with fields (#8)
<!-- Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved. SPDX-License-Identifier: Proprietary --> ### Description Utilities to deal with `fields` ### Test Coverage <!-- Please put an `x` in the correct box e.g. `[x]` to indicate the testing coverage of this change. --> - [x] This change is covered by existing or additional automated tests. - [ ] Manual testing has been performed (and evidence provided) as automated testing was not feasible. - [ ] Additional tests are not required for this change (e.g. documentation update). Co-authored-by: acabarbaye <[email protected]>
1 parent a844298 commit 10ec3b5

File tree

3 files changed

+352
-0
lines changed

3 files changed

+352
-0
lines changed

changes/20221222175115.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
:sparkle: Utilities to deal with fields

utils/field/fields.go

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
/*
2+
* Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package field
7+
8+
import "time"
9+
10+
// ToOptionalInt returns a pointer to an int
11+
func ToOptionalInt(i int) *int {
12+
return &i
13+
}
14+
15+
// OptionalInt returns the value of an optional field or else
16+
// returns defaultValue.
17+
func OptionalInt(ptr *int, defaultValue int) int {
18+
if ptr != nil {
19+
return *ptr
20+
}
21+
return defaultValue
22+
}
23+
24+
// ToOptionalInt32 returns a pointer to an int32.
25+
func ToOptionalInt32(i int32) *int32 {
26+
return &i
27+
}
28+
29+
// OptionalInt32 returns the value of an optional field or else
30+
// returns defaultValue.
31+
func OptionalInt32(ptr *int32, defaultValue int32) int32 {
32+
if ptr != nil {
33+
return *ptr
34+
}
35+
return defaultValue
36+
}
37+
38+
// ToOptionalUint returns a pointer to an uint
39+
func ToOptionalUint(i uint) *uint {
40+
return &i
41+
}
42+
43+
// OptionalUint returns the value of an optional field or else returns defaultValue.
44+
func OptionalUint(ptr *uint, defaultValue uint) uint {
45+
if ptr != nil {
46+
return *ptr
47+
}
48+
return defaultValue
49+
}
50+
51+
// ToOptionalUint32 returns a pointer to an uint32.
52+
func ToOptionalUint32(i uint32) *uint32 {
53+
return &i
54+
}
55+
56+
// OptionalUint32 returns the value of an optional field or else returns defaultValue.
57+
func OptionalUint32(ptr *uint32, defaultValue uint32) uint32 {
58+
if ptr != nil {
59+
return *ptr
60+
}
61+
return defaultValue
62+
}
63+
64+
// ToOptionalInt64 returns a pointer to an int64.
65+
func ToOptionalInt64(i int64) *int64 {
66+
return &i
67+
}
68+
69+
// OptionalInt64 returns the value of an optional field or else returns defaultValue.
70+
func OptionalInt64(ptr *int64, defaultValue int64) int64 {
71+
if ptr != nil {
72+
return *ptr
73+
}
74+
return defaultValue
75+
}
76+
77+
// ToOptionalUint64 returns a pointer to an uint64.
78+
func ToOptionalUint64(i uint64) *uint64 {
79+
return &i
80+
}
81+
82+
// OptionalUint64 returns the value of an optional field or else returns defaultValue.
83+
func OptionalUint64(ptr *uint64, defaultValue uint64) uint64 {
84+
if ptr != nil {
85+
return *ptr
86+
}
87+
return defaultValue
88+
}
89+
90+
// ToOptionalBool returns a pointer to a bool.
91+
func ToOptionalBool(b bool) *bool {
92+
return &b
93+
}
94+
95+
// OptionalBool returns the value of an optional field or else returns defaultValue.
96+
func OptionalBool(ptr *bool, defaultValue bool) bool {
97+
if ptr != nil {
98+
return *ptr
99+
}
100+
return defaultValue
101+
}
102+
103+
// ToOptionalString returns a pointer to a string.
104+
func ToOptionalString(s string) *string {
105+
return &s
106+
}
107+
108+
// OptionalString returns the value of an optional field or else returns defaultValue.
109+
func OptionalString(ptr *string, defaultValue string) string {
110+
if ptr != nil {
111+
return *ptr
112+
}
113+
return defaultValue
114+
}
115+
116+
// ToOptionalFloat32 returns a pointer to a float32.
117+
func ToOptionalFloat32(i float32) *float32 {
118+
return &i
119+
}
120+
121+
// OptionalFloat32 returns the value of an optional field or else returns defaultValue.
122+
func OptionalFloat32(ptr *float32, defaultValue float32) float32 {
123+
if ptr != nil {
124+
return *ptr
125+
}
126+
return defaultValue
127+
}
128+
129+
// ToOptionalFloat64 returns a pointer to a float64.
130+
func ToOptionalFloat64(i float64) *float64 {
131+
return &i
132+
}
133+
134+
// OptionalFloat64 returns the value of an optional field or else returns defaultValue.
135+
func OptionalFloat64(ptr *float64, defaultValue float64) float64 {
136+
if ptr != nil {
137+
return *ptr
138+
}
139+
return defaultValue
140+
}
141+
142+
// ToOptionalDuration returns a pointer to a Duration.
143+
func ToOptionalDuration(i time.Duration) *time.Duration {
144+
return &i
145+
}
146+
147+
// OptionalDuration returns the value of an optional field or else returns defaultValue.
148+
func OptionalDuration(ptr *time.Duration, defaultValue time.Duration) time.Duration {
149+
if ptr != nil {
150+
return *ptr
151+
}
152+
return defaultValue
153+
}

utils/field/fields_test.go

Lines changed: 198 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
/*
2+
* Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
package field
6+
7+
import (
8+
"testing"
9+
"time"
10+
11+
"github.com/bxcodec/faker/v3"
12+
"github.com/stretchr/testify/assert"
13+
)
14+
15+
func TestOptionalField(t *testing.T) {
16+
tests := []struct {
17+
fieldType string
18+
value any
19+
defaultValue any
20+
setFunction func(any) any
21+
getFunction func(any, any) any
22+
}{
23+
{
24+
fieldType: "Int",
25+
value: time.Now().Second(),
26+
defaultValue: 76,
27+
setFunction: func(a any) any {
28+
return ToOptionalInt(a.(int))
29+
},
30+
getFunction: func(a any, a2 any) any {
31+
var ptr *int
32+
if a != nil {
33+
ptr = a.(*int)
34+
}
35+
return OptionalInt(ptr, a2.(int))
36+
},
37+
},
38+
{
39+
fieldType: "UInt",
40+
value: uint(time.Now().Second()),
41+
defaultValue: uint(76),
42+
setFunction: func(a any) any {
43+
return ToOptionalUint(a.(uint))
44+
},
45+
getFunction: func(a any, a2 any) any {
46+
var ptr *uint
47+
if a != nil {
48+
ptr = a.(*uint)
49+
}
50+
return OptionalUint(ptr, a2.(uint))
51+
},
52+
},
53+
{
54+
fieldType: "Int32",
55+
value: int32(time.Now().Second()),
56+
defaultValue: int32(97894),
57+
setFunction: func(a any) any {
58+
return ToOptionalInt32(a.(int32))
59+
},
60+
getFunction: func(a any, a2 any) any {
61+
var ptr *int32
62+
if a != nil {
63+
ptr = a.(*int32)
64+
}
65+
return OptionalInt32(ptr, a2.(int32))
66+
},
67+
},
68+
{
69+
fieldType: "UInt32",
70+
value: uint32(time.Now().Second()),
71+
defaultValue: uint32(97894),
72+
setFunction: func(a any) any {
73+
return ToOptionalUint32(a.(uint32))
74+
},
75+
getFunction: func(a any, a2 any) any {
76+
var ptr *uint32
77+
if a != nil {
78+
ptr = a.(*uint32)
79+
}
80+
return OptionalUint32(ptr, a2.(uint32))
81+
},
82+
},
83+
{
84+
fieldType: "Int64",
85+
value: time.Now().Unix(),
86+
defaultValue: int64(97894),
87+
setFunction: func(a any) any {
88+
return ToOptionalInt64(a.(int64))
89+
},
90+
getFunction: func(a any, a2 any) any {
91+
var ptr *int64
92+
if a != nil {
93+
ptr = a.(*int64)
94+
}
95+
return OptionalInt64(ptr, a2.(int64))
96+
},
97+
},
98+
{
99+
fieldType: "UInt64",
100+
value: uint64(time.Now().Unix()),
101+
defaultValue: uint64(97894),
102+
setFunction: func(a any) any {
103+
return ToOptionalUint64(a.(uint64))
104+
},
105+
getFunction: func(a any, a2 any) any {
106+
var ptr *uint64
107+
if a != nil {
108+
ptr = a.(*uint64)
109+
}
110+
return OptionalUint64(ptr, a2.(uint64))
111+
},
112+
},
113+
{
114+
fieldType: "Float32",
115+
value: float32(time.Now().Second()),
116+
defaultValue: float32(97894.1545),
117+
setFunction: func(a any) any {
118+
return ToOptionalFloat32(a.(float32))
119+
},
120+
getFunction: func(a any, a2 any) any {
121+
var ptr *float32
122+
if a != nil {
123+
ptr = a.(*float32)
124+
}
125+
return OptionalFloat32(ptr, a2.(float32))
126+
},
127+
},
128+
{
129+
fieldType: "Float64",
130+
value: float64(time.Now().Second()),
131+
defaultValue: float64(97894.1545),
132+
setFunction: func(a any) any {
133+
return ToOptionalFloat64(a.(float64))
134+
},
135+
getFunction: func(a any, a2 any) any {
136+
var ptr *float64
137+
if a != nil {
138+
ptr = a.(*float64)
139+
}
140+
return OptionalFloat64(ptr, a2.(float64))
141+
},
142+
},
143+
{
144+
fieldType: "Bool",
145+
value: false,
146+
defaultValue: true,
147+
setFunction: func(a any) any {
148+
return ToOptionalBool(a.(bool))
149+
},
150+
getFunction: func(a any, a2 any) any {
151+
var ptr *bool
152+
if a != nil {
153+
ptr = a.(*bool)
154+
}
155+
return OptionalBool(ptr, a2.(bool))
156+
},
157+
},
158+
{
159+
fieldType: "String",
160+
value: faker.Sentence(),
161+
defaultValue: faker.Name(),
162+
setFunction: func(a any) any {
163+
return ToOptionalString(a.(string))
164+
},
165+
getFunction: func(a any, a2 any) any {
166+
var ptr *string
167+
if a != nil {
168+
ptr = a.(*string)
169+
}
170+
return OptionalString(ptr, a2.(string))
171+
},
172+
},
173+
{
174+
fieldType: "Duration",
175+
value: time.Millisecond,
176+
defaultValue: time.Second,
177+
setFunction: func(a any) any {
178+
return ToOptionalDuration(a.(time.Duration))
179+
},
180+
getFunction: func(a any, a2 any) any {
181+
var ptr *time.Duration
182+
if a != nil {
183+
ptr = a.(*time.Duration)
184+
}
185+
return OptionalDuration(ptr, a2.(time.Duration))
186+
},
187+
},
188+
}
189+
for i := range tests {
190+
test := tests[i]
191+
t.Run(test.fieldType, func(t *testing.T) {
192+
to := test.setFunction(test.value)
193+
assert.NotNil(t, to)
194+
assert.Equal(t, test.defaultValue, test.getFunction(nil, test.defaultValue))
195+
assert.Equal(t, test.value, test.getFunction(to, test.defaultValue))
196+
})
197+
}
198+
}

0 commit comments

Comments
 (0)