93 lines
2.2 KiB
Go
93 lines
2.2 KiB
Go
package localserver
|
|
|
|
import (
|
|
"fmt"
|
|
"sync/atomic"
|
|
)
|
|
|
|
func validateRequest(req map[string]string, entries ...string) (err error) {
|
|
for _, entry := range entries {
|
|
if _, ok := req[entry]; !ok {
|
|
err = fmt.Errorf("no field %s in req payload", entry)
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func ToStringSlice(slice []any) (strSlice []string, err error) {
|
|
strSlice = []string{}
|
|
for _, value := range slice {
|
|
if strValue, ok := value.(string); ok {
|
|
strSlice = append(strSlice, strValue)
|
|
} else {
|
|
err = fmt.Errorf("value in slice of wrong type")
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func atomicallyExecute(flag *uint32, job func() (err error)) (err error) {
|
|
for {
|
|
if atomic.CompareAndSwapUint32(flag, 0, 1) {
|
|
defer atomic.SwapUint32(flag, 0)
|
|
err = job()
|
|
break
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func VerifyFieldsString(payload map[string]any, fields ...string) (err error) {
|
|
for _, field := range fields {
|
|
if _, ok := payload[field]; !ok {
|
|
err = fmt.Errorf("no field %s in payload", field)
|
|
return
|
|
} else if _, ok := payload[field].(string); !ok {
|
|
err = fmt.Errorf("field %s in payload is not a string", field)
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func VerifyFieldsBool(payload map[string]any, fields ...string) (err error) {
|
|
for _, field := range fields {
|
|
if _, ok := payload[field]; !ok {
|
|
err = fmt.Errorf("no field %s in payload", field)
|
|
return
|
|
} else if _, ok := payload[field].(bool); !ok {
|
|
err = fmt.Errorf("field %s in payload is not a bool", field)
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func VerifyFieldsFloat64(payload map[string]any, fields ...string) (err error) {
|
|
for _, field := range fields {
|
|
if _, ok := payload[field]; !ok {
|
|
err = fmt.Errorf("no field %s in payload", field)
|
|
return
|
|
} else if _, ok := payload[field].(float64); !ok {
|
|
err = fmt.Errorf("field %s in payload is not a float64", field)
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func VerifyFieldsSliceInterface(payload map[string]any, fields ...string) (err error) {
|
|
for _, field := range fields {
|
|
if _, ok := payload[field]; !ok {
|
|
err = fmt.Errorf("no field %s in payload", field)
|
|
return
|
|
} else if _, ok := payload[field].([]any); !ok {
|
|
err = fmt.Errorf("field %s in payload is not a []any", field)
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|