// Copyright (c) HashiCorp, Inc. // 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 }