Files
EvoBGP/internal/pipeline/parse.go
T

48 lines
953 B
Go

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{}
}