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 {
|
2018-10-01 15:51:41 -07:00
|
|
|
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
|
|
|
}
|
2018-10-01 15:39:57 -07: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 {
|
2018-10-01 15:47:59 -07:00
|
|
|
m, err := NewMultiaddrBytes(b)
|
2014-11-05 02:20:27 -08:00
|
|
|
if err != nil {
|
|
|
|
panic(fmt.Errorf("multiaddr failed to parse: %s", err))
|
|
|
|
}
|
2018-10-01 15:47:59 -07:00
|
|
|
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
|
|
|
|
}
|