golib/net/ipgate/format.go
AJ ONeal dddfdd392c
feat(net/ipgate): IP allowlist/blocklist via PrefixSet and DomainSet
PrefixSet: git-backed CIDR files via gitshallow, refreshed every 47 min.
DomainSet: takes pre-parsed (staticPrefixes, domains []string); resolves
hostnames every 5 min, retaining stale IPs on failure. Both use
atomic-swapped ipcohort.Cohort for lock-free reads.

ParseDomainSet(RecordReader) parses rows into prefixes and hostnames;
caller constructs the record reader (e.g. csv.Reader with delimiter,
comment char). RecordReader interface is satisfied by *csv.Reader.

commaify uses plain string concat (integers max ~7 groups).
2026-05-22 12:23:35 -04:00

30 lines
391 B
Go

package ipgate
import (
"log/slog"
"strconv"
)
func log() *slog.Logger { return slog.Default().WithGroup("ipgate") }
func commaify(n int) string {
s := strconv.Itoa(n)
if n < 0 {
return "-" + commaify(-n)
}
if len(s) <= 3 {
return s
}
rem := len(s) % 3
if rem == 0 {
rem = 3
}
out := s[:rem]
for i := rem; i < len(s); i += 3 {
out += "," + s[i:i+3]
}
return out
}