Select Git revision
-
Daniel Naude authoredDaniel Naude authored
struct_utils.go 5.73 KiB
package struct_utils
import (
"github.com/samber/lo"
"gitlab.bob.co.za/bob-public-utils/bobgroup-go-utils/errors"
"reflect"
"strings"
)
// KeyValuePair defines a key/value pair derived from form data
type KeyValuePair struct {
Key string `json:"key"`
Value string `json:"value"`
}
// FormToKeyValuePairs returns a string-based map of strings as derived from posted form keys and values.
// e.g. oauth_consumer_key=mlhgs&oauth_consumer_secret=x240ar&oauth_verifier=b0qjbx&store_base_url=http%3A%2F%2Flocalhost.com%2Fstore
func FormToKeyValuePairs(body string) []KeyValuePair {
out := []KeyValuePair{}
parts := strings.Split(body, "&")
for _, p := range parts {
split := strings.Split(p, "=")
var key string
if len(split) > 0 {
key = split[0]
}
var value string
if len(split) > 1 {
value = split[1]
}
kv := KeyValuePair{
Key: key,
Value: value,
}
out = append(out, kv)
}
return out
}
// GetValue returns the value for the given key from a KeyValuePair slice.
func GetValue(key string, kv []KeyValuePair) string {
for _, v := range kv {
if v.Key == key {
return v.Value
}
}
return ""
}
// ValidateRequiredFields checks the required tag on struct fields and returns an error if any are set to zero.
func ValidateRequiredFields(object any, parentFieldKeys ...string) error {
objectValue := reflect.ValueOf(object)
if objectValue.Kind() == reflect.Interface {
objectValue = objectValue.Elem()
}
if objectValue.Kind() == reflect.Ptr {
objectValue = objectValue.Elem()
}
if objectValue.Kind() != reflect.Struct {
if objectValue.IsZero() {
errorKey := strings.Join(parentFieldKeys, ".")
return errors.Error(errorKey + " is required")