Skip to content

Commit ab8dd10

Browse files
committed
Simplify public interface (potentially temporarily) to simplify code
1 parent 6946391 commit ab8dd10

File tree

3 files changed

+83
-141
lines changed

3 files changed

+83
-141
lines changed

cmd/routesum/main.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func main() {
3232
}
3333

3434
func summarize(in io.Reader, out, memStatsOut io.Writer) error {
35-
rs := routesum.NewRouteSum()
35+
rs := routesum.New()
3636
scanner := bufio.NewScanner(in)
3737
for scanner.Scan() {
3838
line := bytes.TrimSpace(scanner.Bytes())
@@ -62,7 +62,12 @@ Total size of data structure: %d
6262
)
6363
}
6464

65-
for _, s := range rs.SummaryStrings() {
65+
strs, err := rs.SummaryStrings()
66+
if err != nil {
67+
return err //nolint: wrapcheck
68+
}
69+
70+
for _, s := range strs {
6671
if _, err := out.Write([]byte(s + "\n")); err != nil {
6772
return fmt.Errorf("write output: %w", err)
6873
}

pkg/routesum/routesum.go

Lines changed: 34 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -2,153 +2,79 @@
22
package routesum
33

44
import (
5-
"fmt"
6-
"net/netip"
75
"strings"
86

9-
"github.com/PatrickCronin/routesum/pkg/routesum/bitslice"
7+
"github.com/PatrickCronin/routesum/pkg/routesum/routetype"
108
"github.com/PatrickCronin/routesum/pkg/routesum/rstrie"
11-
"github.com/pkg/errors"
12-
"inet.af/netaddr"
139
)
1410

1511
// RouteSum has methods supporting route summarization of networks and hosts
1612
type RouteSum struct {
17-
ipv4, ipv6 *rstrie.RSTrie
13+
v4 *rstrie.RSTrie[*routetype.V4]
14+
v6 *rstrie.RSTrie[*routetype.V6]
1815
}
1916

20-
// NewRouteSum returns an initialized RouteSum object
21-
func NewRouteSum() *RouteSum {
17+
// New returns an initialized RouteSum object
18+
func New() *RouteSum {
2219
rs := new(RouteSum)
23-
rs.ipv4 = rstrie.NewRSTrie()
24-
rs.ipv6 = rstrie.NewRSTrie()
20+
rs.v4 = rstrie.New[*routetype.V4]()
21+
rs.v6 = rstrie.New[*routetype.V6]()
2522

2623
return rs
2724
}
2825

2926
// InsertFromString adds either a string-formatted network or IP to the summary
3027
func (rs *RouteSum) InsertFromString(s string) error {
31-
var ip netip.Addr
32-
var ipBits bitslice.BitSlice
33-
var err error
34-
35-
if strings.Contains(s, "/") {
36-
ipPrefix, err := netip.ParsePrefix(s)
28+
if strings.Contains(s, ":") {
29+
r, err := routetype.ParseV6String(s)
3730
if err != nil {
38-
return fmt.Errorf("parse network: %w", err)
39-
}
40-
if !ipPrefix.IsValid() {
41-
return errors.Errorf("%s is not valid CIDR", s)
31+
return err //nolint: wrapcheck
4232
}
4333

44-
ip = ipPrefix.Addr()
45-
ipBits, err = ipBitsForIPPrefix(ipPrefix)
46-
if err != nil {
47-
return err
48-
}
34+
rs.v6.InsertRoute(r)
4935
} else {
50-
ip, err = netip.ParseAddr(s)
51-
if err != nil {
52-
return fmt.Errorf("parse IP: %w", err)
53-
}
54-
if !ip.IsValid() {
55-
return errors.Errorf("%s is not a valid IP", s)
56-
}
57-
58-
ipBits, err = ipBitsForIP(ip)
36+
r, err := routetype.ParseV4String(s)
5937
if err != nil {
60-
return err
38+
return err //nolint: wrapcheck
6139
}
62-
}
6340

64-
if ip.Is4() {
65-
rs.ipv4.InsertRoute(ipBits)
66-
} else {
67-
rs.ipv6.InsertRoute(ipBits)
41+
rs.v4.InsertRoute(r)
6842
}
6943

7044
return nil
7145
}
7246

73-
func ipBitsForIPPrefix(ipPrefix netip.Prefix) (bitslice.BitSlice, error) {
74-
ipBytes, err := ipPrefix.Addr().MarshalBinary()
75-
if err != nil {
76-
return nil, errors.Wrapf(err, "express %s as bytes", ipPrefix.Addr().String())
77-
}
78-
79-
ipBits, err := bitslice.NewFromBytes(ipBytes)
80-
if err != nil {
81-
return nil, fmt.Errorf("express %s as bits: %w", ipPrefix.Addr().String(), err)
82-
}
83-
84-
return ipBits[:ipPrefix.Bits()], nil
85-
}
86-
87-
func ipBitsForIP(ip netip.Addr) (bitslice.BitSlice, error) {
88-
ipBytes, err := ip.MarshalBinary()
89-
if err != nil {
90-
return nil, errors.Wrapf(err, "express %s as bytes", ip.String())
91-
}
92-
93-
ipBits, err := bitslice.NewFromBytes(ipBytes)
94-
if err != nil {
95-
return nil, fmt.Errorf("express %s as bits: %w", ip.String(), err)
96-
}
97-
98-
return ipBits, nil
99-
}
100-
10147
// SummaryStrings returns a summary of all received routes as a string slice.
102-
func (rs *RouteSum) SummaryStrings() []string {
48+
func (rs *RouteSum) SummaryStrings() ([]string, error) {
10349
strs := []string{}
10450

105-
ipv4BitSlices := rs.ipv4.Contents()
106-
for _, bits := range ipv4BitSlices {
107-
ip := ipv4FromBits(bits)
108-
109-
if len(bits) == 8*4 {
110-
strs = append(strs, ip.String())
111-
} else {
112-
ipPrefix := netaddr.IPPrefixFrom(ip, uint8(len(bits)))
113-
strs = append(strs, ipPrefix.String())
51+
for _, r := range rs.v4.Contents() {
52+
str, err := r.String()
53+
if err != nil {
54+
return nil, err //nolint: wrapcheck
11455
}
115-
}
116-
117-
ipv6BitSlices := rs.ipv6.Contents()
118-
for _, bits := range ipv6BitSlices {
119-
ip := ipv6FromBits(bits)
12056

121-
if len(bits) == 8*16 {
122-
strs = append(strs, ip.String())
123-
} else {
124-
ipPrefix := netaddr.IPPrefixFrom(ip, uint8(len(bits)))
125-
strs = append(strs, ipPrefix.String())
126-
}
57+
strs = append(strs, str)
12758
}
12859

129-
return strs
130-
}
60+
for _, r := range rs.v6.Contents() {
61+
str, err := r.String()
62+
if err != nil {
63+
return nil, err //nolint: wrapcheck
64+
}
13165

132-
func ipv4FromBits(bits bitslice.BitSlice) netaddr.IP {
133-
bytes := bits.ToBytes(4)
134-
byteArray := [4]byte{}
135-
copy(byteArray[:], bytes[0:4])
136-
return netaddr.IPFrom4(byteArray)
137-
}
66+
strs = append(strs, str)
67+
}
13868

139-
func ipv6FromBits(bits bitslice.BitSlice) netaddr.IP {
140-
bytes := bits.ToBytes(16)
141-
byteArray := [16]byte{}
142-
copy(byteArray[:], bytes[0:16])
143-
return netaddr.IPv6Raw(byteArray)
69+
return strs, nil
14470
}
14571

14672
// MemUsage provides information about memory usage.
14773
func (rs *RouteSum) MemUsage() (uint, uint, uintptr, uintptr) {
148-
ipv4NumInternalNodes, ipv4NumLeafNodes, ipv4InternalNodesTotalSize, ipv4LeafNodesTotalSize := rs.ipv4.MemUsage()
149-
ipv6NumInternalNodes, ipv6NumLeafNodes, ipv6InternalNodesTotalSize, ipv6LeafNodesTotalSize := rs.ipv6.MemUsage()
150-
return ipv4NumInternalNodes + ipv6NumInternalNodes,
151-
ipv4NumLeafNodes + ipv6NumLeafNodes,
152-
ipv4InternalNodesTotalSize + ipv6InternalNodesTotalSize,
153-
ipv4LeafNodesTotalSize + ipv6LeafNodesTotalSize
74+
v4NumInternalNodes, v4NumLeafNodes, v4InternalNodesTotalSize, v4LeafNodesTotalSize := rs.v4.MemUsage()
75+
v6NumInternalNodes, v6NumLeafNodes, v6InternalNodesTotalSize, v6LeafNodesTotalSize := rs.v6.MemUsage()
76+
return v4NumInternalNodes + v6NumInternalNodes,
77+
v4NumLeafNodes + v6NumLeafNodes,
78+
v4InternalNodesTotalSize + v6InternalNodesTotalSize,
79+
v4LeafNodesTotalSize + v6LeafNodesTotalSize
15480
}

0 commit comments

Comments
 (0)