| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- // package arena_string -- потокобезопасный компонент списка строк для анализа арены
- package arena_string
- import (
- "fmt"
- "strings"
- "sync"
- . "wartank/app/lev0/types"
- "wartank/pkg/kernel/kernel_log"
- )
- // АренаСтроки -- потокобезопасный список строк арены
- type АренаСтроки struct {
- val []string
- strControl string // Контрольная строка в исходной строке для анализа арены
- block sync.RWMutex
- }
- // НовАренаСтроки -- возвращает новый потокобезопасный список строк арены
- func НовАренаСтроки(конт ИБотКонтекст, strControl string) *АренаСтроки {
- лог := kernel_log.НовЛоггер("АренаСтроки")
- лог.Отладка("НовАренаСтроки(): strControl=%q", strControl)
- лог.Паника(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)
- }
|