| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- // package arena_string -- потокобезопасный компонент списка строк для анализа арены
- package arena_string
- import (
- "fmt"
- "strings"
- "sync"
- . "gitp78su.ipnodns.ru/svi/kern"
- . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
- . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
- )
- // АренаСтроки -- потокобезопасный список строк арены
- type АренаСтроки struct {
- val []string
- strControl string // Контрольная строка в исходной строке для анализа арены
- block sync.RWMutex
- }
- // НовАренаСтроки -- возвращает новый потокобезопасный список строк арены
- func НовАренаСтроки(конт ILocalCtx, strControl string) *АренаСтроки {
- лог := NewLogBuf()
- лог.Debug("НовАренаСтроки(): strControl=%q", strControl)
- Hassert(strControl != "", "НовАренаСтроки(): strControl is empty")
- сам := &АренаСтроки{
- val: make([]string, 0),
- strControl: strControl,
- }
- return сам
- }
- // Получ -- возвращает список строк для анализа
- func (сам *АренаСтроки) Получ() []string {
- сам.block.RLock()
- defer сам.block.RUnlock()
- return сам.val
- }
- // Set -- устанавливает список строк для анализа
- func (сам *АренаСтроки) Set(lstString []string) error {
- сам.block.Lock()
- defer сам.block.Unlock()
- if lstString == nil {
- return fmt.Errorf("АренаСтроки.Set(): lstString == nil")
- }
- if len(lstString) == 0 {
- return fmt.Errorf("АренаСтроки.Set(): lstString ничего не содержит")
- }
- isOk := false
- for _, strControl := range lstString {
- if strings.Contains(strControl, сам.strControl) {
- isOk = true
- break
- }
- }
- if isOk {
- сам.val = lstString
- return nil
- }
- // Найти заголовок
- var strOut string
- for _, strOut = range lstString {
- if strings.Contains(strOut, "<title>") {
- break
- }
- }
- return fmt.Errorf("АренаСтроки.Set(): lstString не имеет правильный title(%q), фактически(%q)", сам.strControl, strOut)
- }
|