Skip to content

Commit 810fef7

Browse files
authored
✨ [fields] Extends utilities with regards to optional fields (#533)
<!-- Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved. SPDX-License-Identifier: Apache-2.0 --> ### Description extend `[field]` utilities to use generics ### 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).
1 parent 685188a commit 810fef7

File tree

3 files changed

+87
-71
lines changed

3 files changed

+87
-71
lines changed

changes/20241216151002.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
:sparkles: [fields] Extends utilities with regards to optional fields

utils/field/fields.go

Lines changed: 65 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -9,172 +9,166 @@ package field
99
import "time"
1010

1111
// ToOptionalInt returns a pointer to an int
12-
func ToOptionalInt(i int) *int {
13-
return &i
12+
func ToOptionalInt(f int) *int {
13+
return ToOptional(f)
1414
}
1515

1616
// OptionalInt returns the value of an optional field or else
1717
// returns defaultValue.
1818
func OptionalInt(ptr *int, defaultValue int) int {
19-
if ptr != nil {
20-
return *ptr
21-
}
22-
return defaultValue
19+
return Optional(ptr, defaultValue)
2320
}
2421

2522
// ToOptionalInt32 returns a pointer to an int32.
26-
func ToOptionalInt32(i int32) *int32 {
27-
return &i
23+
func ToOptionalInt32(f int32) *int32 {
24+
return ToOptional(f)
2825
}
2926

3027
// OptionalInt32 returns the value of an optional field or else
3128
// returns defaultValue.
3229
func OptionalInt32(ptr *int32, defaultValue int32) int32 {
33-
if ptr != nil {
34-
return *ptr
35-
}
36-
return defaultValue
30+
return Optional(ptr, defaultValue)
3731
}
3832

3933
// ToOptionalUint returns a pointer to an uint
40-
func ToOptionalUint(i uint) *uint {
41-
return &i
34+
func ToOptionalUint(f uint) *uint {
35+
return ToOptional(f)
4236
}
4337

4438
// OptionalUint returns the value of an optional field or else returns defaultValue.
4539
func OptionalUint(ptr *uint, defaultValue uint) uint {
46-
if ptr != nil {
47-
return *ptr
48-
}
49-
return defaultValue
40+
return Optional(ptr, defaultValue)
5041
}
5142

5243
// ToOptionalUint32 returns a pointer to an uint32.
53-
func ToOptionalUint32(i uint32) *uint32 {
54-
return &i
44+
func ToOptionalUint32(f uint32) *uint32 {
45+
return ToOptional(f)
5546
}
5647

5748
// OptionalUint32 returns the value of an optional field or else returns defaultValue.
5849
func OptionalUint32(ptr *uint32, defaultValue uint32) uint32 {
59-
if ptr != nil {
60-
return *ptr
61-
}
62-
return defaultValue
50+
return Optional(ptr, defaultValue)
6351
}
6452

6553
// ToOptionalInt64 returns a pointer to an int64.
66-
func ToOptionalInt64(i int64) *int64 {
67-
return &i
54+
func ToOptionalInt64(f int64) *int64 {
55+
return ToOptional(f)
6856
}
6957

7058
// OptionalInt64 returns the value of an optional field or else returns defaultValue.
7159
func OptionalInt64(ptr *int64, defaultValue int64) int64 {
72-
if ptr != nil {
73-
return *ptr
74-
}
75-
return defaultValue
60+
return Optional(ptr, defaultValue)
7661
}
7762

7863
// ToOptionalUint64 returns a pointer to an uint64.
79-
func ToOptionalUint64(i uint64) *uint64 {
80-
return &i
64+
func ToOptionalUint64(f uint64) *uint64 {
65+
return ToOptional(f)
8166
}
8267

8368
// OptionalUint64 returns the value of an optional field or else returns defaultValue.
8469
func OptionalUint64(ptr *uint64, defaultValue uint64) uint64 {
85-
if ptr != nil {
86-
return *ptr
87-
}
88-
return defaultValue
70+
return Optional(ptr, defaultValue)
8971
}
9072

9173
// ToOptionalBool returns a pointer to a bool.
9274
func ToOptionalBool(b bool) *bool {
93-
return &b
75+
return ToOptional(b)
9476
}
9577

9678
// OptionalBool returns the value of an optional field or else returns defaultValue.
9779
func OptionalBool(ptr *bool, defaultValue bool) bool {
98-
if ptr != nil {
99-
return *ptr
100-
}
101-
return defaultValue
80+
return Optional(ptr, defaultValue)
10281
}
10382

10483
// ToOptionalString returns a pointer to a string.
10584
func ToOptionalString(s string) *string {
106-
return &s
85+
return ToOptional(s)
10786
}
10887

10988
// OptionalString returns the value of an optional field or else returns defaultValue.
11089
func OptionalString(ptr *string, defaultValue string) string {
111-
if ptr != nil {
112-
return *ptr
113-
}
114-
return defaultValue
90+
return Optional(ptr, defaultValue)
11591
}
11692

11793
// ToOptionalAny returns a pointer to a object.
11894
func ToOptionalAny(a any) *any {
119-
return &a
95+
return ToOptional(a)
12096
}
12197

12298
// OptionalAny returns the value of an optional field or else returns defaultValue.
12399
func OptionalAny(ptr *any, defaultValue any) any {
124-
if ptr != nil {
125-
return *ptr
126-
}
127-
return defaultValue
100+
return Optional(ptr, defaultValue)
128101
}
129102

130103
// ToOptionalFloat32 returns a pointer to a float32.
131-
func ToOptionalFloat32(i float32) *float32 {
132-
return &i
104+
func ToOptionalFloat32(f float32) *float32 {
105+
return ToOptional(f)
133106
}
134107

135108
// OptionalFloat32 returns the value of an optional field or else returns defaultValue.
136109
func OptionalFloat32(ptr *float32, defaultValue float32) float32 {
137-
if ptr != nil {
138-
return *ptr
139-
}
140-
return defaultValue
110+
return Optional(ptr, defaultValue)
141111
}
142112

143113
// ToOptionalFloat64 returns a pointer to a float64.
144-
func ToOptionalFloat64(i float64) *float64 {
145-
return &i
114+
func ToOptionalFloat64(f float64) *float64 {
115+
return ToOptional(f)
146116
}
147117

148118
// OptionalFloat64 returns the value of an optional field or else returns defaultValue.
149119
func OptionalFloat64(ptr *float64, defaultValue float64) float64 {
150-
if ptr != nil {
151-
return *ptr
152-
}
153-
return defaultValue
120+
return Optional(ptr, defaultValue)
154121
}
155122

156123
// ToOptionalDuration returns a pointer to a Duration.
157-
func ToOptionalDuration(i time.Duration) *time.Duration {
158-
return &i
124+
func ToOptionalDuration(f time.Duration) *time.Duration {
125+
return ToOptional(f)
159126
}
160127

161128
// OptionalDuration returns the value of an optional field or else returns defaultValue.
162129
func OptionalDuration(ptr *time.Duration, defaultValue time.Duration) time.Duration {
163-
if ptr != nil {
164-
return *ptr
165-
}
166-
return defaultValue
130+
return Optional(ptr, defaultValue)
167131
}
168132

169133
// ToOptionalTime returns a pointer to a Time.
170-
func ToOptionalTime(i time.Time) *time.Time {
171-
return &i
134+
func ToOptionalTime(f time.Time) *time.Time {
135+
return ToOptional(f)
172136
}
173137

174138
// OptionalTime returns the value of an optional field or else returns defaultValue.
175139
func OptionalTime(ptr *time.Time, defaultValue time.Time) time.Time {
140+
return Optional(ptr, defaultValue)
141+
}
142+
143+
// ToOptional returns a pointer to the given field value.
144+
func ToOptional[T any](v T) *T {
145+
return &v
146+
}
147+
148+
// Optional returns the value of an optional field or else returns defaultValue.
149+
func Optional[T any](ptr *T, defaultValue T) T {
176150
if ptr != nil {
177151
return *ptr
178152
}
179153
return defaultValue
180154
}
155+
156+
// Equal returns true if both arguments are nil or both arguments
157+
// dereference to the same value.
158+
func Equal[T comparable](a, b *T) bool {
159+
if (a == nil) != (b == nil) {
160+
return false
161+
}
162+
if a == nil {
163+
return true
164+
}
165+
return EqualValue(a, *b)
166+
}
167+
168+
// EqualValue returns true if optional field dereferences to the value.
169+
func EqualValue[T comparable](field *T, value T) bool {
170+
if field == nil {
171+
return false
172+
}
173+
return *field == value
174+
}

utils/field/fields_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,3 +228,24 @@ func TestOptionalField(t *testing.T) {
228228
})
229229
}
230230
}
231+
232+
func TestEqual(t *testing.T) {
233+
type T int
234+
assert.True(t, Equal[T](nil, nil))
235+
assert.False(t, Equal(ToOptionalInt(1), nil))
236+
assert.False(t, Equal(nil, ToOptionalInt(1)))
237+
assert.True(t, Equal(ToOptionalInt(1), ToOptionalInt(1)))
238+
str := faker.Sentence()
239+
assert.True(t, Equal(ToOptionalString(str), ToOptionalString(str)))
240+
assert.False(t, Equal(ToOptionalString(str), ToOptionalString("")))
241+
}
242+
243+
func TestEqualValue(t *testing.T) {
244+
type T any
245+
assert.False(t, EqualValue[T](nil, nil))
246+
assert.False(t, EqualValue(nil, 1))
247+
assert.True(t, EqualValue(ToOptionalInt(1), 1))
248+
str := faker.Sentence()
249+
assert.True(t, EqualValue(ToOptionalString(str), str))
250+
assert.False(t, EqualValue(ToOptionalString(str), ""))
251+
}

0 commit comments

Comments
 (0)