nuclei/v2/pkg/utils/insertion_ordered_map.go
zt2 03612a28b8 feat(template): allow custom type in metadata
In some case you may need to use custom type in `metadata`, like nested array or nested k-v:

```yaml
info:
  metadata:
    components:
      - bootstrap
      - jquery
```

So this commit allowed use any custom type in `metadata`.
2022-02-27 22:28:00 +08:00

38 lines
1.0 KiB
Go

package utils
type InsertionOrderedStringMap struct {
keys []string `yaml:"-"`
values map[string]interface{}
}
func NewEmptyInsertionOrderedStringMap(size int) *InsertionOrderedStringMap {
return &InsertionOrderedStringMap{
keys: make([]string, 0, size),
values: make(map[string]interface{}, size),
}
}
func NewInsertionOrderedStringMap(stringMap map[string]interface{}) *InsertionOrderedStringMap {
result := NewEmptyInsertionOrderedStringMap(len(stringMap))
for k, v := range stringMap {
result.Set(k, v)
}
return result
}
func (insertionOrderedStringMap *InsertionOrderedStringMap) ForEach(fn func(key string, data interface{})) {
for _, key := range insertionOrderedStringMap.keys {
fn(key, insertionOrderedStringMap.values[key])
}
}
func (insertionOrderedStringMap *InsertionOrderedStringMap) Set(key string, value interface{}) {
_, present := insertionOrderedStringMap.values[key]
insertionOrderedStringMap.values[key] = value
if !present {
insertionOrderedStringMap.keys = append(insertionOrderedStringMap.keys, key)
}
}