go-multiaddr/util.go

58 lines
1.2 KiB
Go
Raw Normal View History

2014-11-05 02:20:27 -08:00
package multiaddr
2014-11-05 02:30:53 -08:00
import "fmt"
2014-11-05 02:20:27 -08:00
// Split returns the sub-address portions of a multiaddr.
func Split(m Multiaddr) []Multiaddr {
var addrs []Multiaddr
ForEach(m, func(c Component) bool {
addrs = append(addrs, &c)
return true
})
2014-11-05 02:20:27 -08:00
return addrs
}
// Join returns a combination of addresses.
func Join(ms ...Multiaddr) Multiaddr {
2018-10-01 15:44:27 -07:00
switch len(ms) {
case 0:
// empty multiaddr, unfortunately, we have callers that rely on
// this contract.
return multiaddr{}
case 1:
return ms[0]
}
2014-11-05 02:30:53 -08:00
length := 0
bs := make([][]byte, len(ms))
for i, m := range ms {
bs[i] = m.Bytes()
length += len(bs[i])
}
bidx := 0
b := make([]byte, length)
for _, mb := range bs {
2018-10-01 15:44:27 -07:00
bidx += copy(b[bidx:], mb)
2014-11-05 02:20:27 -08:00
}
return multiaddr{bytes: b}
2014-11-05 02:20:27 -08:00
}
// Cast re-casts a byte slice as a multiaddr. will panic if it fails to parse.
func Cast(b []byte) Multiaddr {
m, err := NewMultiaddrBytes(b)
2014-11-05 02:20:27 -08:00
if err != nil {
panic(fmt.Errorf("multiaddr failed to parse: %s", err))
}
return m
2014-11-05 02:20:27 -08:00
}
// StringCast like Cast, but parses a string. Will also panic if it fails to parse.
func StringCast(s string) Multiaddr {
m, err := NewMultiaddr(s)
if err != nil {
panic(fmt.Errorf("multiaddr failed to parse: %s", err))
}
return m
}