-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathcombining_processor.go
More file actions
74 lines (62 loc) · 1.75 KB
/
combining_processor.go
File metadata and controls
74 lines (62 loc) · 1.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package main
import (
"bytes"
"net"
)
type CombiningProcessor struct {
first net.IP
last net.IP
next net.IP
value string
Emitter
}
func CombiningProcessorCreate() *CombiningProcessor {
return &CombiningProcessor{
first: net.IP{},
last: net.IP{},
value: "",
}
}
func (m *CombiningProcessor) Subscribed(id string) {
}
func (m *CombiningProcessor) Header(id string, header Header) error {
header.general += "# Adjacent blocks with matching have been combined\n#\n"
return m.Emitter.Header(header)
}
func (m *CombiningProcessor) buildAndEmit() error {
//log.Printf("buildAndEmit: first=%s, last=%s, value='%s'", m.first.String(), m.last.String(), m.value)
nets := make([]*net.IPNet, 0)
IPNetFromFirstLast(&m.first, &m.last, &nets)
for _, net := range nets {
block := BlockCreate(net, &m.value)
//log.Printf("buildAndEmit: emit.net=%s, value='%s'", block.net.String(), *block.value)
if err := m.Emit(block); err != nil {
return err
}
}
return nil
}
func (m *CombiningProcessor) Receive(id string, block *Block) error {
//log.Printf("Receive: block.net=%s, block.value=%s", block.net.String(), *block.value)
if m.value != *block.value || bytes.Compare(m.next, block.net.IP) != 0 {
// There's a change in value or gap in ips, we can't comebine
if len(m.value) > 0 {
// We have a non-empty current value so we need to emit whatever
// we've built up
if err := m.buildAndEmit(); err != nil {
return err
}
}
// A new starting point and value for current, last will get updated
// below
m.first = block.net.IP
m.value = *block.value
}
// Always update last
m.last = *NetLast(block.net)
m.next = *IPNext(&m.last)
return nil
}
func (m *CombiningProcessor) Done(id string) error {
return m.Emitter.Done()
}