lststring.go 1.5 KB

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