arena_string.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. // package arena_string -- потокобезопасный компонент списка строк для анализа арены
  2. package arena_string
  3. import (
  4. "strings"
  5. "sync"
  6. . "gitp78su.ipnodns.ru/svi/kern"
  7. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  8. . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
  9. )
  10. // АренаСтроки -- потокобезопасный список строк арены
  11. type АренаСтроки struct {
  12. val []string
  13. strControl string // Контрольная строка в исходной строке для анализа арены
  14. block sync.RWMutex
  15. }
  16. // НовАренаСтроки -- возвращает новый потокобезопасный список строк арены
  17. func НовАренаСтроки(конт ILocalCtx, strControl string) *АренаСтроки {
  18. лог := NewLogBuf()
  19. лог.Debug("НовАренаСтроки(): strControl=%q", strControl)
  20. Hassert(strControl != "", "НовАренаСтроки(): strControl is empty")
  21. сам := &АренаСтроки{
  22. val: make([]string, 0),
  23. strControl: strControl,
  24. }
  25. return сам
  26. }
  27. // Получ -- возвращает список строк для анализа
  28. func (сам *АренаСтроки) Получ() []string {
  29. сам.block.RLock()
  30. defer сам.block.RUnlock()
  31. return сам.val
  32. }
  33. // Set -- устанавливает список строк для анализа
  34. func (сам *АренаСтроки) Set(lstString []string) {
  35. сам.block.Lock()
  36. defer сам.block.Unlock()
  37. Hassert(lstString != nil, "АренаСтроки.Set(): lstString == nil")
  38. Hassert(len(lstString) > 0, "АренаСтроки.Set(): lstString ничего не содержит")
  39. isOk := false
  40. for _, strControl := range lstString {
  41. if strings.Contains(strControl, сам.strControl) {
  42. isOk = true
  43. break
  44. }
  45. }
  46. if isOk {
  47. сам.val = lstString
  48. return
  49. }
  50. // Найти заголовок
  51. var strOut string
  52. for _, strOut = range lstString {
  53. if strings.Contains(strOut, "<title>") {
  54. break
  55. }
  56. }
  57. Hassert(false, "АренаСтроки.Set(): lstString не имеет правильный title(%q), фактически(%q)", сам.strControl, strOut)
  58. }