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 }