arena_string.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // package arena_string -- потокобезопасный компонент списка строк для анализа арены
  2. package arena_string
  3. import (
  4. "fmt"
  5. "strings"
  6. "sync"
  7. . "wartank/app/lev0/types"
  8. "wartank/pkg/kernel/kernel_log"
  9. )
  10. // АренаСтроки -- потокобезопасный список строк арены
  11. type АренаСтроки struct {
  12. val []string
  13. strControl string // Контрольная строка в исходной строке для анализа арены
  14. block sync.RWMutex
  15. }
  16. // НовАренаСтроки -- возвращает новый потокобезопасный список строк арены
  17. func НовАренаСтроки(конт ИБотКонтекст, strControl string) *АренаСтроки {
  18. лог := kernel_log.НовЛоггер("АренаСтроки")
  19. лог.Отладка("НовАренаСтроки(): strControl=%q", strControl)
  20. лог.Паника(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) error {
  35. сам.block.Lock()
  36. defer сам.block.Unlock()
  37. if lstString == nil {
  38. return fmt.Errorf("АренаСтроки.Set(): lstString == nil")
  39. }
  40. if len(lstString) == 0 {
  41. return fmt.Errorf("АренаСтроки.Set(): lstString ничего не содержит")
  42. }
  43. isOk := false
  44. for _, strControl := range lstString {
  45. if strings.Contains(strControl, сам.strControl) {
  46. isOk = true
  47. break
  48. }
  49. }
  50. if isOk {
  51. сам.val = lstString
  52. return nil
  53. }
  54. // Найти заголовок
  55. var strOut string
  56. for _, strOut = range lstString {
  57. if strings.Contains(strOut, "<title>") {
  58. break
  59. }
  60. }
  61. return fmt.Errorf("АренаСтроки.Set(): lstString не имеет правильный title(%q), фактически(%q)", сам.strControl, strOut)
  62. }