package static_param

import (
	"fmt"
	"sync"
)

/*
	Исходник предоставляет единичный статичный параметр статистики
	танка. Проверяет присваиваемые значения.
	Потокобезопасно.
*/

// StaticParam -- потокобезопасный параметр танка
type StaticParam struct {
	name  string
	val   int
	block sync.RWMutex
}

// NewStaticParam -- возвращает новый *StaticParam
func NewStaticParam(name string) *StaticParam {
	if name == "" {
		panic(fmt.Errorf("NewStaticParam(): name is empty"))
	}
	sf := &StaticParam{
		name: name,
	}
	return sf
}

// Set -- устанавливает параметр
func (sf *StaticParam) Set(val int) {
	sf.block.Lock()
	defer sf.block.Unlock()
	sf.val = val
}

// Get -- возвращает значение хранимого параметра
func (sf *StaticParam) Get() int {
	sf.block.RLock()
	defer sf.block.RUnlock()
	return sf.val
}

// Name -- возвращает имя хранимого параметра
func (sf *StaticParam) Name() string {
	sf.block.RLock()
	defer sf.block.RUnlock()
	return sf.name
}

// SetName -- устанавливает имя параметра
func (sf *StaticParam) SetName(name string) {
	sf.block.Lock()
	defer sf.block.Unlock()
	sf.name = name
}
