Skip to content

Commit 12f7f91

Browse files
committed
feat: add StringToMailAddressHookFunc
1 parent 8c61ec1 commit 12f7f91

1 file changed

Lines changed: 29 additions & 0 deletions

File tree

decode_hooks.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"errors"
66
"fmt"
77
"net"
8+
"net/mail"
89
"net/netip"
910
"net/url"
1011
"reflect"
@@ -652,3 +653,31 @@ func StringToComplex128HookFunc() DecodeHookFunc {
652653
return strconv.ParseComplex(data.(string), 128)
653654
}
654655
}
656+
657+
// StringToMailAddressHookFunc returns a DecodeHookFunc that converts
658+
// strings to mail.Address.
659+
func StringToMailAddressHookFunc() DecodeHookFunc {
660+
return func(
661+
f reflect.Type,
662+
t reflect.Type,
663+
data interface{}) (interface{}, error) {
664+
if f.Kind() != reflect.String {
665+
return data, nil
666+
}
667+
if t != reflect.TypeOf(mail.Address{}) {
668+
return data, nil
669+
}
670+
671+
// Convert it by parsing
672+
addr, err := mail.ParseAddress(data.(string))
673+
if err != nil {
674+
return mail.Address{}, fmt.Errorf("failed parsing mail address %v: %w", data, err)
675+
}
676+
677+
if addr == nil {
678+
return mail.Address{}, fmt.Errorf("failed parsing mail address %v", data)
679+
}
680+
681+
return *addr, nil
682+
}
683+
}

0 commit comments

Comments
 (0)