ctx_value.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. // package ctx_value -- потокобезопасное значение локального контекста.
  2. package ctx_value
  3. import (
  4. "sync"
  5. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
  7. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
  8. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/voc/etime"
  9. )
  10. // ICtxValue -- интерфейс к значению локального контекста.
  11. type ICtxValue interface {
  12. core_spec.IRWMutex
  13. // Key -- возвращает ключ значения
  14. Key() defs.ITxtFix
  15. // Val -- возвращает хранимое значение
  16. Val() any
  17. // CreateAt -- возвращает метку времени создания
  18. CreateAt() core_spec.ITime
  19. // UpdateAt -- возвращает метку времени обновления
  20. UpdateAt() core_spec.ITimeMut
  21. // Comment -- возвращает комментарий значения
  22. Comment() defs.ITxtFix
  23. }
  24. // CtxValue -- потокобезопасное значение локального контекста.
  25. type CtxValue struct {
  26. sync.RWMutex
  27. key defs.ITxtFix
  28. createAt core_spec.ITime
  29. Val_ any
  30. UpdateAt_ core_spec.ITimeMut
  31. Comment_ defs.ITxtFix
  32. }
  33. // NewCtxValue -- возвращает новое потокобезопасное значение локального контекста.
  34. func NewCtxValue(key defs.ITxtFix, val any, comment any) ICtxValue {
  35. helpers.Hassert(key != nil, "NewCtxValue(): key is empty", []any{})
  36. sf := &CtxValue{
  37. key: key,
  38. createAt: etime.NewETimeAuto(),
  39. UpdateAt_: etime.NewETimeAutoMut(),
  40. Val_: val,
  41. Comment_: defs.Txt("%v", comment),
  42. }
  43. return sf
  44. }
  45. // Key -- возвращает ключ значения.
  46. func (sf *CtxValue) Key() defs.ITxtFix {
  47. return sf.key
  48. }
  49. // Val -- возвращает хранимое значение.
  50. func (sf *CtxValue) Val() any {
  51. sf.RLock()
  52. defer sf.RUnlock()
  53. return sf.Val_
  54. }
  55. // UpdateAt -- возвращает время обновления значения.
  56. func (sf *CtxValue) UpdateAt() core_spec.ITimeMut {
  57. sf.RLock()
  58. defer sf.RUnlock()
  59. return sf.UpdateAt_
  60. }
  61. // CreateAt -- возвращает время создания значения.
  62. func (sf *CtxValue) CreateAt() core_spec.ITime {
  63. return sf.createAt
  64. }
  65. // Comment -- возвращает комментарий значения.
  66. func (sf *CtxValue) Comment() defs.ITxtFix {
  67. sf.RLock()
  68. defer sf.RUnlock()
  69. return sf.Comment_
  70. }