lst_string.go 1.8 KB

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