53 lines
1.1 KiB
Go
53 lines
1.1 KiB
Go
package multistep
|
|
|
|
import "sync"
|
|
|
|
// Add context to state bag to prevent changing step signature
|
|
|
|
// StateBag holds the state that is used by the Runner and Steps. The
|
|
// StateBag implementation must be safe for concurrent access.
|
|
type StateBag interface {
|
|
Get(string) interface{}
|
|
GetOk(string) (interface{}, bool)
|
|
Put(string, interface{})
|
|
Remove(string)
|
|
}
|
|
|
|
// BasicStateBag implements StateBag by using a normal map underneath
|
|
// protected by a RWMutex.
|
|
type BasicStateBag struct {
|
|
data map[string]interface{}
|
|
l sync.RWMutex
|
|
once sync.Once
|
|
}
|
|
|
|
func (b *BasicStateBag) Get(k string) interface{} {
|
|
result, _ := b.GetOk(k)
|
|
return result
|
|
}
|
|
|
|
func (b *BasicStateBag) GetOk(k string) (interface{}, bool) {
|
|
b.l.RLock()
|
|
defer b.l.RUnlock()
|
|
|
|
result, ok := b.data[k]
|
|
return result, ok
|
|
}
|
|
|
|
func (b *BasicStateBag) Put(k string, v interface{}) {
|
|
b.l.Lock()
|
|
defer b.l.Unlock()
|
|
|
|
// Make sure the map is initialized one time, on write
|
|
b.once.Do(func() {
|
|
b.data = make(map[string]interface{})
|
|
})
|
|
|
|
// Write the data
|
|
b.data[k] = v
|
|
}
|
|
|
|
func (b *BasicStateBag) Remove(k string) {
|
|
delete(b.data, k)
|
|
}
|