package pipeline import ( "bufio" "net/netip" "strings" ) // ParseCIDRLines extracts unique IPv4/IPv6 CIDRs from plain text (one per line, # comments, empty lines skipped). func ParseCIDRLines(body string) []netip.Prefix { seen := make(map[string]struct{}) var out []netip.Prefix sc := bufio.NewScanner(strings.NewReader(body)) for sc.Scan() { line := strings.TrimSpace(sc.Text()) if line == "" || strings.HasPrefix(line, "#") { continue } pfx := parseOneCIDR(line) if !pfx.IsValid() { continue } m := pfx.Masked() s := m.String() if _, ok := seen[s]; ok { continue } seen[s] = struct{}{} out = append(out, m) } return out } func parseOneCIDR(s string) netip.Prefix { if p, err := netip.ParsePrefix(s); err == nil { return p } if addr, err := netip.ParseAddr(s); err == nil { if addr.Is4() { p, _ := addr.Prefix(32) return p } p, _ := addr.Prefix(128) return p } return netip.Prefix{} }