| // Copyright IBM Corp. 2014, 2026 | |
| // SPDX-License-Identifier: BUSL-1.1 | |
| package testing | |
| import ( | |
| "sync" | |
| "github.com/zclconf/go-cty/cty" | |
| ) | |
| // ResourceStore is a simple data store, that can let the mock provider defined | |
| // in this package store and return interesting values for resources and data | |
| // sources. | |
| type ResourceStore struct { | |
| mutex sync.RWMutex | |
| Resources map[string]cty.Value | |
| } | |
| func NewResourceStore() *ResourceStore { | |
| return &ResourceStore{ | |
| Resources: map[string]cty.Value{}, | |
| } | |
| } | |
| func (rs *ResourceStore) Get(id string) (cty.Value, bool) { | |
| rs.mutex.RLock() | |
| defer rs.mutex.RUnlock() | |
| value, exists := rs.Resources[id] | |
| return value, exists | |
| } | |
| func (rs *ResourceStore) Set(id string, value cty.Value) { | |
| rs.mutex.Lock() | |
| defer rs.mutex.Unlock() | |
| rs.Resources[id] = value | |
| } | |
| func (rs *ResourceStore) Delete(id string) { | |
| rs.mutex.Lock() | |
| defer rs.mutex.Unlock() | |
| delete(rs.Resources, id) | |
| } | |
| // ResourceStoreBuilder is an implementation of the builder pattern for building | |
| // a ResourceStore with prepopulated values. | |
| type ResourceStoreBuilder struct { | |
| store *ResourceStore | |
| } | |
| func NewResourceStoreBuilder() *ResourceStoreBuilder { | |
| return &ResourceStoreBuilder{ | |
| store: NewResourceStore(), | |
| } | |
| } | |
| func (b *ResourceStoreBuilder) AddResource(id string, value cty.Value) *ResourceStoreBuilder { | |
| if b.store == nil { | |
| panic("cannot add resources after calling Build()") | |
| } | |
| b.store.Set(id, value) | |
| return b | |
| } | |
| func (b *ResourceStoreBuilder) Build() *ResourceStore { | |
| if b.store == nil { | |
| panic("cannot call Build() more than once") | |
| } | |
| store := b.store | |
| b.store = nil | |
| return store | |
| } |