109 lines
2.3 KiB
Go
109 lines
2.3 KiB
Go
// Copyright 2016 The OPA Authors. All rights reserved.
|
|
// Use of this source code is governed by an Apache2
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package ast
|
|
|
|
import (
|
|
"encoding/json"
|
|
|
|
"github.com/open-policy-agent/opa/v1/util"
|
|
)
|
|
|
|
// ValueMap represents a key/value map between AST term values. Any type of term
|
|
// can be used as a key in the map.
|
|
type ValueMap struct {
|
|
hashMap *util.TypedHashMap[Value, Value]
|
|
}
|
|
|
|
// NewValueMap returns a new ValueMap.
|
|
func NewValueMap() *ValueMap {
|
|
return &ValueMap{
|
|
hashMap: util.NewTypedHashMap(ValueEqual, ValueEqual, Value.Hash, Value.Hash, nil),
|
|
}
|
|
}
|
|
|
|
// MarshalJSON provides a custom marshaller for the ValueMap which
|
|
// will include the key, value, and value type.
|
|
func (vs *ValueMap) MarshalJSON() ([]byte, error) {
|
|
var tmp []map[string]any
|
|
vs.Iter(func(k Value, v Value) bool {
|
|
tmp = append(tmp, map[string]any{
|
|
"name": k.String(),
|
|
"type": ValueName(v),
|
|
"value": v,
|
|
})
|
|
return false
|
|
})
|
|
return json.Marshal(tmp)
|
|
}
|
|
|
|
// Equal returns true if this ValueMap equals the other.
|
|
func (vs *ValueMap) Equal(other *ValueMap) bool {
|
|
if vs == nil {
|
|
return other == nil || other.Len() == 0
|
|
}
|
|
if other == nil {
|
|
return vs.Len() == 0
|
|
}
|
|
return vs.hashMap.Equal(other.hashMap)
|
|
}
|
|
|
|
// Len returns the number of elements in the map.
|
|
func (vs *ValueMap) Len() int {
|
|
if vs == nil {
|
|
return 0
|
|
}
|
|
return vs.hashMap.Len()
|
|
}
|
|
|
|
// Get returns the value in the map for k.
|
|
func (vs *ValueMap) Get(k Value) Value {
|
|
if vs != nil {
|
|
if v, ok := vs.hashMap.Get(k); ok {
|
|
return v
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Hash returns a hash code for this ValueMap.
|
|
func (vs *ValueMap) Hash() int {
|
|
if vs == nil {
|
|
return 0
|
|
}
|
|
return vs.hashMap.Hash()
|
|
}
|
|
|
|
// Iter calls the iter function for each key/value pair in the map. If the iter
|
|
// function returns true, iteration stops.
|
|
func (vs *ValueMap) Iter(iter func(Value, Value) bool) bool {
|
|
if vs == nil {
|
|
return false
|
|
}
|
|
return vs.hashMap.Iter(iter)
|
|
}
|
|
|
|
// Put inserts a key k into the map with value v.
|
|
func (vs *ValueMap) Put(k, v Value) {
|
|
if vs == nil {
|
|
panic("put on nil value map")
|
|
}
|
|
vs.hashMap.Put(k, v)
|
|
}
|
|
|
|
// Delete removes a key k from the map.
|
|
func (vs *ValueMap) Delete(k Value) {
|
|
if vs == nil {
|
|
return
|
|
}
|
|
vs.hashMap.Delete(k)
|
|
}
|
|
|
|
func (vs *ValueMap) String() string {
|
|
if vs == nil {
|
|
return "{}"
|
|
}
|
|
return vs.hashMap.String()
|
|
}
|