arena_string.go 2.2 KB

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