package dataformat
import (
mapsutil "github.com/projectdiscovery/utils/maps"
"golang.org/x/exp/maps"
)
type KV struct {
Map mapsutil.Map[string, any]
OrderedMap *mapsutil.OrderedMap[string, any]
}
func (kv *KV) Clone() KV {
newKV := KV{}
if kv.OrderedMap == nil {
newKV.Map = maps.Clone(kv.Map)
return newKV
}
clonedOrderedMap := kv.OrderedMap.Clone()
newKV.OrderedMap = &clonedOrderedMap
return newKV
}
func (kv *KV) IsNIL() bool {
return kv.Map == nil && kv.OrderedMap == nil
}
func (kv *KV) IsOrderedMap() bool {
return kv.OrderedMap != nil
}
func (kv *KV) Set(key string, value any) {
if kv.OrderedMap != nil {
kv.OrderedMap.Set(key, value)
return
}
if kv.Map == nil {
kv.Map = make(map[string]interface{})
}
kv.Map[key] = value
}
func (kv *KV) Get(key string) interface{} {
if kv.OrderedMap != nil {
value, ok := kv.OrderedMap.Get(key)
if !ok {
return nil
}
return value
}
return kv.Map[key]
}
func (kv *KV) Iterate(f func(key string, value any) bool) {
if kv.OrderedMap != nil {
kv.OrderedMap.Iterate(func(key string, value any) bool {
return f(key, value)
})
return
}
for key, value := range kv.Map {
if !f(key, value) {
break
}
}
}
func (kv *KV) Delete(key string) bool {
if kv.OrderedMap != nil {
_, ok := kv.OrderedMap.Get(key)
if !ok {
return false
}
kv.OrderedMap.Delete(key)
return true
}
_, ok := kv.Map[key]
if !ok {
return false
}
delete(kv.Map, key)
return true
}
func KVMap(data map[string]interface{}) KV {
return KV{Map: data}
}
func KVOrderedMap(data *mapsutil.OrderedMap[string, any]) KV {
return KV{OrderedMap: data}
}
func ToMap(m *mapsutil.OrderedMap[string, any]) map[string]interface{} {
data := make(map[string]interface{})
m.Iterate(func(key string, value any) bool {
data[key] = value
return true
})
return data
}
func ToOrderedMap(data map[string]interface{}) *mapsutil.OrderedMap[string, any] {
m := mapsutil.NewOrderedMap[string, any]()
for key, value := range data {
m.Set(key, value)
}
return &m
}