Moar parsers

This commit is contained in:
2025-10-06 23:11:50 +02:00
parent a254b306f2
commit 5f0f4aa96b
14 changed files with 419 additions and 136 deletions

72
dataset/parser/list.go Normal file
View File

@@ -0,0 +1,72 @@
package parser
import (
"bufio"
"io"
"net"
"net/netip"
"strings"
"git.maze.io/maze/styx/internal/sliceutil"
)
func init() {
RegisterDomainsParser(listDomainsParser{})
RegisterNetworksParser(listNetworksParser{})
}
type listDomainsParser struct{}
func (listDomainsParser) CanHandle(line string) bool {
return isDomainName(line) &&
!strings.ContainsRune(line, ' ') &&
!strings.ContainsRune(line, ':') &&
net.ParseIP(line) == nil
}
func (listDomainsParser) ParseDomains(r io.Reader) (domains []string, ignored int, err error) {
scanner := bufio.NewScanner(r)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if isComment(line) {
continue
}
if isDomainName(line) {
domains = append(domains, line)
continue
}
ignored++
}
if err = scanner.Err(); err != nil {
return
}
return sliceutil.Unique(domains), ignored, nil
}
type listNetworksParser struct{}
func (listNetworksParser) CanHandle(line string) bool {
return isPrefix(line) || isIP(line)
}
func (listNetworksParser) ParseNetworks(r io.Reader) (prefixes []netip.Prefix, ignored int, err error) {
scanner := bufio.NewScanner(r)
for scanner.Scan() {
line := strings.TrimSpace(scanner.Text())
if isComment(line) {
continue
}
if prefix, err := netip.ParsePrefix(line); err == nil {
prefixes = append(prefixes, prefix)
continue
} else if addr, err := netip.ParseAddr(line); err == nil && !addr.IsUnspecified() && addr.IsValid() {
prefixes = append(prefixes, addrToPrefix(addr))
continue
}
ignored++
}
if err = scanner.Err(); err != nil {
return
}
return sliceutil.Unique(prefixes), ignored, nil
}