Skip to content

Commit 305800f

Browse files
authored
Merge pull request #503 from Icinga/parseString-DRY
parseString(): Don't Repeat Yourself
2 parents cee8fbd + 6627ecb commit 305800f

File tree

3 files changed

+49
-53
lines changed

3 files changed

+49
-53
lines changed

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ require (
1616
github.com/ssgreg/journald v1.0.0
1717
github.com/stretchr/testify v1.8.0
1818
go.uber.org/zap v1.21.0
19-
golang.org/x/exp v0.0.0-20210514180818-737f94c0881e
19+
golang.org/x/exp v0.0.0-20220613132600-b0d781184e0d
2020
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
2121
)
2222

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
8080
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
8181
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
8282
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
83-
golang.org/x/exp v0.0.0-20210514180818-737f94c0881e h1:VqVU3dsTLGDa5pW74b+xG1lvKltt4EZIUrFPeKOqV2s=
84-
golang.org/x/exp v0.0.0-20210514180818-737f94c0881e/go.mod h1:MSdmUWF4ZWBPSUbgUX/gaau5kvnbkSs9pgtY6B9JXDE=
83+
golang.org/x/exp v0.0.0-20220613132600-b0d781184e0d h1:vtUKgx8dahOomfFzLREU8nSv25YHnTgLBn4rDnWZdU0=
84+
golang.org/x/exp v0.0.0-20220613132600-b0d781184e0d/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA=
8585
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
8686
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
8787
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=

pkg/structify/structify.go

Lines changed: 46 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"github.com/icinga/icingadb/pkg/contracts"
77
"github.com/pkg/errors"
8+
"golang.org/x/exp/constraints"
89
"reflect"
910
"strconv"
1011
"strings"
@@ -118,66 +119,61 @@ func parseString(src string, dest interface{}) error {
118119
*ptr = &src
119120
return nil
120121
case *uint8:
121-
i, err := strconv.ParseUint(src, 10, int(unsafe.Sizeof(*ptr)*8))
122-
if err == nil {
123-
*ptr = uint8(i)
124-
}
125-
return err
122+
return parseUint(src, ptr)
126123
case *uint16:
127-
i, err := strconv.ParseUint(src, 10, int(unsafe.Sizeof(*ptr)*8))
128-
if err == nil {
129-
*ptr = uint16(i)
130-
}
131-
return err
124+
return parseUint(src, ptr)
132125
case *uint32:
133-
i, err := strconv.ParseUint(src, 10, int(unsafe.Sizeof(*ptr)*8))
134-
if err == nil {
135-
*ptr = uint32(i)
136-
}
137-
return err
126+
return parseUint(src, ptr)
138127
case *uint64:
139-
i, err := strconv.ParseUint(src, 10, int(unsafe.Sizeof(*ptr)*8))
140-
if err == nil {
141-
*ptr = i
142-
}
143-
return err
128+
return parseUint(src, ptr)
144129
case *int8:
145-
i, err := strconv.ParseInt(src, 10, int(unsafe.Sizeof(*ptr)*8))
146-
if err == nil {
147-
*ptr = int8(i)
148-
}
149-
return err
130+
return parseInt(src, ptr)
150131
case *int16:
151-
i, err := strconv.ParseInt(src, 10, int(unsafe.Sizeof(*ptr)*8))
152-
if err == nil {
153-
*ptr = int16(i)
154-
}
155-
return err
132+
return parseInt(src, ptr)
156133
case *int32:
157-
i, err := strconv.ParseInt(src, 10, int(unsafe.Sizeof(*ptr)*8))
158-
if err == nil {
159-
*ptr = int32(i)
160-
}
161-
return err
134+
return parseInt(src, ptr)
162135
case *int64:
163-
i, err := strconv.ParseInt(src, 10, int(unsafe.Sizeof(*ptr)*8))
164-
if err == nil {
165-
*ptr = i
166-
}
167-
return err
136+
return parseInt(src, ptr)
168137
case *float32:
169-
f, err := strconv.ParseFloat(src, int(unsafe.Sizeof(*ptr)*8))
170-
if err == nil {
171-
*ptr = float32(f)
172-
}
173-
return err
138+
return parseFloat(src, ptr)
174139
case *float64:
175-
f, err := strconv.ParseFloat(src, int(unsafe.Sizeof(*ptr)*8))
176-
if err == nil {
177-
*ptr = f
178-
}
179-
return err
140+
return parseFloat(src, ptr)
180141
default:
181142
panic(fmt.Sprintf("unsupported type: %T", dest))
182143
}
183144
}
145+
146+
// parseUint parses src into *dest.
147+
func parseUint[T constraints.Unsigned](src string, dest *T) error {
148+
i, err := strconv.ParseUint(src, 10, bitSizeOf[T]())
149+
if err == nil {
150+
*dest = T(i)
151+
}
152+
153+
return err
154+
}
155+
156+
// parseInt parses src into *dest.
157+
func parseInt[T constraints.Signed](src string, dest *T) error {
158+
i, err := strconv.ParseInt(src, 10, bitSizeOf[T]())
159+
if err == nil {
160+
*dest = T(i)
161+
}
162+
163+
return err
164+
}
165+
166+
// parseFloat parses src into *dest.
167+
func parseFloat[T constraints.Float](src string, dest *T) error {
168+
f, err := strconv.ParseFloat(src, bitSizeOf[T]())
169+
if err == nil {
170+
*dest = T(f)
171+
}
172+
173+
return err
174+
}
175+
176+
func bitSizeOf[T any]() int {
177+
var x T
178+
return int(unsafe.Sizeof(x) * 8)
179+
}

0 commit comments

Comments
 (0)