Files
bkl/util.go
2023-07-19 09:58:42 -07:00

162 lines
2.4 KiB
Go

package bkl
import (
"github.com/gopatchy/bkl/polyfill"
)
func hasNilValue(m map[string]any, k string) bool {
v, found := m[k]
if !found {
return false
}
return v == nil
}
func toBool(a any) (bool, bool) {
v, ok := a.(bool)
return v, ok
}
func getBoolValue(m map[string]any, k string) (bool, bool) {
v, found := m[k]
if !found {
return false, false
}
return toBool(v)
}
func hasBoolValue(m map[string]any, k string, v bool) bool {
v2, ok := getBoolValue(m, k)
if !ok {
return false
}
return v2 == v
}
func popBoolValue(m map[string]any, k string, v bool) (bool, map[string]any) {
found := hasBoolValue(m, k, v)
if found {
m = polyfill.MapsClone(m)
delete(m, k)
}
return found, m
}
func toString(a any) string {
v, ok := a.(string)
if !ok {
return ""
}
return v
}
func getStringValue(m map[string]any, k string) string {
v, found := m[k]
if !found {
return ""
}
return toString(v)
}
func popStringValue(m map[string]any, k string) (string, map[string]any) {
v := getStringValue(m, k)
if v != "" {
m = polyfill.MapsClone(m)
delete(m, k)
}
return v, m
}
func listHasBoolValue(l []any, k string, v bool) bool {
for _, x := range l {
xMap, ok := x.(map[string]any)
if !ok {
continue
}
if hasBoolValue(xMap, k, v) {
return true
}
}
return false
}
func listGetStringValue(l []any, k string) string {
for _, x := range l {
xMap, ok := x.(map[string]any)
if !ok {
continue
}
v2 := getStringValue(xMap, k)
if v2 != "" {
return v2
}
}
return ""
}
func listPopStringValue(l []any, k string) (string, []any) {
v2 := listGetStringValue(l, k)
if v2 != "" {
l, _ = filterList(l, func(x any) ([]any, error) {
xMap, ok := x.(map[string]any)
if !ok {
return []any{x}, nil
}
if getStringValue(xMap, k) == "" {
return []any{x}, nil
}
return nil, nil
})
}
return v2, l
}
func filterMap(m map[string]any, filter func(string, any) (map[string]any, error)) (map[string]any, error) {
ret := map[string]any{}
for k, v := range m {
m2, err := filter(k, v)
if err != nil {
return nil, err
}
for k2, v2 := range m2 {
ret[k2] = v2
}
}
return ret, nil
}
func filterList(l []any, filter func(any) ([]any, error)) ([]any, error) {
ret := []any{}
for _, v := range l {
l2, err := filter(v)
if err != nil {
return nil, err
}
ret = append(ret, l2...)
}
return ret, nil
}