arena_string.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. // Get -- возвращает список строк для анализа
  27. func (сам *АренаСтроки) Get() []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 is nil")
  38. }
  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 nil
  49. }
  50. // Найти заголовок
  51. var strOut string
  52. for _, strOut = range lstString {
  53. if strings.Contains(strOut, "<title>") {
  54. break
  55. }
  56. }
  57. return fmt.Errorf("АренаСтроки.Set(): lstString не имеет правильный title(%q), фактически(%q)", сам.strControl, strOut)
  58. }