diff options
Diffstat (limited to 'internal/configuration/decode_hooks.go')
| -rw-r--r-- | internal/configuration/decode_hooks.go | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/internal/configuration/decode_hooks.go b/internal/configuration/decode_hooks.go new file mode 100644 index 000000000..b2012d9ff --- /dev/null +++ b/internal/configuration/decode_hooks.go @@ -0,0 +1,35 @@ +package configuration + +import ( + "fmt" + "net/mail" + "reflect" + + "github.com/mitchellh/mapstructure" +) + +// StringToMailAddressFunc decodes a string into a mail.Address. +func StringToMailAddressFunc() mapstructure.DecodeHookFunc { + return func(f reflect.Kind, t reflect.Kind, data interface{}) (value interface{}, err error) { + if f != reflect.String || t != reflect.TypeOf(mail.Address{}).Kind() { + return data, nil + } + + dataStr := data.(string) + + if dataStr == "" { + return mail.Address{}, nil + } + + var ( + mailAddress *mail.Address + ) + + mailAddress, err = mail.ParseAddress(dataStr) + if err != nil { + return nil, fmt.Errorf("could not parse '%s' as a RFC5322 address: %w", dataStr, err) + } + + return *mailAddress, nil + } +} |
