forked from anacrolix/dht
-
Notifications
You must be signed in to change notification settings - Fork 0
/
addr-maybe-id.go
66 lines (57 loc) · 1.45 KB
/
addr-maybe-id.go
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
package types
import (
"fmt"
"github.com/anacrolix/generics"
"github.com/anacrolix/multiless"
"github.com/anacrolix/dht/v2/int160"
"github.com/anacrolix/dht/v2/krpc"
)
func AddrMaybeIdSliceFromNodeInfoSlice(nis []krpc.NodeInfo) (ret []AddrMaybeId) {
ret = make([]AddrMaybeId, 0, len(nis))
for _, ni := range nis {
id := int160.FromByteArray(ni.ID)
ret = append(ret, AddrMaybeId{
Addr: ni.Addr.ToNodeAddrPort(),
Id: generics.Some(id),
})
}
return
}
type AddrMaybeId struct {
Addr krpc.NodeAddrPort
Id generics.Option[int160.T]
}
func (me AddrMaybeId) TryIntoNodeInfo() (ret *krpc.NodeInfo) {
if !me.Id.Ok {
return nil
}
return &krpc.NodeInfo{
ID: me.Id.Value.AsByteArray(),
Addr: me.Addr.ToNodeAddr(),
}
}
func (me *AddrMaybeId) FromNodeInfo(ni krpc.NodeInfo) {
id := int160.FromByteArray(ni.ID)
*me = AddrMaybeId{
Addr: ni.Addr.ToNodeAddrPort(),
Id: generics.Some(id),
}
}
func (me AddrMaybeId) String() string {
if !me.Id.Ok {
return fmt.Sprintf("unknown id at %s", me.Addr)
} else {
return fmt.Sprintf("%v at %v", me.Id.Value, me.Addr)
}
}
func (l AddrMaybeId) CloserThan(r AddrMaybeId, target int160.T) bool {
ml := multiless.New().Bool(!l.Id.Ok, !r.Id.Ok)
if l.Id.Ok && r.Id.Ok {
ml = ml.Cmp(l.Id.Value.Distance(target).Cmp(r.Id.Value.Distance(target)))
}
if !ml.Ok() {
ml = ml.Cmp(l.Addr.Addr().Compare(r.Addr.Addr()))
ml = multiless.EagerOrdered(ml, l.Addr.Port(), r.Addr.Port())
}
return ml.Less()
}