Recode parser logic
This commit is contained in:
@@ -2,27 +2,75 @@ package parser
|
||||
|
||||
import (
|
||||
"bufio"
|
||||
"github.com/d3m0k1d/BanForge/internal/logger"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/d3m0k1d/BanForge/internal/logger"
|
||||
)
|
||||
|
||||
type Event struct {
|
||||
Data string
|
||||
}
|
||||
|
||||
type Scaner struct {
|
||||
type Scanner struct {
|
||||
scanner *bufio.Scanner
|
||||
ch chan Event
|
||||
stopCh chan struct{}
|
||||
logger *logger.Logger
|
||||
file *os.File
|
||||
pollDelay time.Duration
|
||||
}
|
||||
|
||||
func CreateScaner(path string) *Scaner {
|
||||
log := logger.New(false)
|
||||
func NewScanner(path string) (*Scanner, error) {
|
||||
file, err := os.Open(path)
|
||||
if err != nil {
|
||||
log.Error(err.Error())
|
||||
return nil, err
|
||||
}
|
||||
return &Scaner{
|
||||
|
||||
return &Scanner{
|
||||
scanner: bufio.NewScanner(file),
|
||||
ch: make(chan Event),
|
||||
ch: make(chan Event, 100),
|
||||
stopCh: make(chan struct{}),
|
||||
logger: logger.New(false),
|
||||
file: file,
|
||||
pollDelay: 100 * time.Millisecond,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *Scanner) Start() {
|
||||
s.logger.Info("Scanner started")
|
||||
|
||||
go func() {
|
||||
for {
|
||||
select {
|
||||
case <-s.stopCh:
|
||||
s.logger.Info("Scanner stopped")
|
||||
return
|
||||
|
||||
default:
|
||||
if s.scanner.Scan() {
|
||||
s.ch <- Event{
|
||||
Data: s.scanner.Text(),
|
||||
}
|
||||
} else {
|
||||
if err := s.scanner.Err(); err != nil {
|
||||
s.logger.Error("Scanner error:", err)
|
||||
return
|
||||
}
|
||||
time.Sleep(s.pollDelay)
|
||||
}
|
||||
}
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
func (s *Scanner) Stop() {
|
||||
close(s.stopCh)
|
||||
time.Sleep(150 * time.Millisecond)
|
||||
s.file.Close()
|
||||
close(s.ch)
|
||||
}
|
||||
|
||||
func (s *Scanner) Events() <-chan Event {
|
||||
return s.ch
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user