@@ -2,6 +2,7 @@ package multiaddr
2
2
3
3
import (
4
4
"bytes"
5
+ "encoding/json"
5
6
"fmt"
6
7
"log"
7
8
"strings"
@@ -24,7 +25,7 @@ func NewMultiaddr(s string) (a Multiaddr, err error) {
24
25
if err != nil {
25
26
return nil , err
26
27
}
27
- return multiaddr {bytes : b }, nil
28
+ return & multiaddr {bytes : b }, nil
28
29
}
29
30
30
31
// NewMultiaddrBytes initializes a Multiaddr from a byte representation.
@@ -41,33 +42,73 @@ func NewMultiaddrBytes(b []byte) (a Multiaddr, err error) {
41
42
return nil , err
42
43
}
43
44
44
- return multiaddr {bytes : b }, nil
45
+ return & multiaddr {bytes : b }, nil
45
46
}
46
47
47
48
// Equal tests whether two multiaddrs are equal
48
- func (m multiaddr ) Equal (m2 Multiaddr ) bool {
49
+ func (m * multiaddr ) Equal (m2 Multiaddr ) bool {
49
50
return bytes .Equal (m .bytes , m2 .Bytes ())
50
51
}
51
52
52
53
// Bytes returns the []byte representation of this Multiaddr
53
54
//
54
55
// Do not modify the returned buffer, it may be shared.
55
- func (m multiaddr ) Bytes () []byte {
56
+ func (m * multiaddr ) Bytes () []byte {
56
57
return m .bytes
57
58
}
58
59
59
60
// String returns the string representation of a Multiaddr
60
- func (m multiaddr ) String () string {
61
+ func (m * multiaddr ) String () string {
61
62
s , err := bytesToString (m .bytes )
62
63
if err != nil {
63
64
panic (fmt .Errorf ("multiaddr failed to convert back to string. corrupted? %s" , err ))
64
65
}
65
66
return s
66
67
}
67
68
69
+ func (m * multiaddr ) MarshalBinary () ([]byte , error ) {
70
+ return m .Bytes (), nil
71
+ }
72
+
73
+ func (m * multiaddr ) UnmarshalBinary (data []byte ) error {
74
+ new , err := NewMultiaddrBytes (data )
75
+ if err != nil {
76
+ return err
77
+ }
78
+ * m = * (new .(* multiaddr ))
79
+ return nil
80
+ }
81
+
82
+ func (m * multiaddr ) MarshalText () ([]byte , error ) {
83
+ return []byte (m .String ()), nil
84
+ }
85
+
86
+ func (m * multiaddr ) UnmarshalText (data []byte ) error {
87
+ new , err := NewMultiaddr (string (data ))
88
+ if err != nil {
89
+ return err
90
+ }
91
+ * m = * (new .(* multiaddr ))
92
+ return nil
93
+ }
94
+
95
+ func (m * multiaddr ) MarshalJSON () ([]byte , error ) {
96
+ return json .Marshal (m .String ())
97
+ }
98
+
99
+ func (m * multiaddr ) UnmarshalJSON (data []byte ) error {
100
+ var v string
101
+ if err := json .Unmarshal (data , & v ); err != nil {
102
+ return err
103
+ }
104
+ new , err := NewMultiaddr (v )
105
+ * m = * (new .(* multiaddr ))
106
+ return err
107
+ }
108
+
68
109
// Protocols returns the list of protocols this Multiaddr has.
69
110
// will panic in case we access bytes incorrectly.
70
- func (m multiaddr ) Protocols () []Protocol {
111
+ func (m * multiaddr ) Protocols () []Protocol {
71
112
ps := make ([]Protocol , 0 , 8 )
72
113
b := m .bytes
73
114
for len (b ) > 0 {
@@ -96,26 +137,26 @@ func (m multiaddr) Protocols() []Protocol {
96
137
}
97
138
98
139
// Encapsulate wraps a given Multiaddr, returning the resulting joined Multiaddr
99
- func (m multiaddr ) Encapsulate (o Multiaddr ) Multiaddr {
140
+ func (m * multiaddr ) Encapsulate (o Multiaddr ) Multiaddr {
100
141
mb := m .bytes
101
142
ob := o .Bytes ()
102
143
103
144
b := make ([]byte , len (mb )+ len (ob ))
104
145
copy (b , mb )
105
146
copy (b [len (mb ):], ob )
106
- return multiaddr {bytes : b }
147
+ return & multiaddr {bytes : b }
107
148
}
108
149
109
150
// Decapsulate unwraps Multiaddr up until the given Multiaddr is found.
110
- func (m multiaddr ) Decapsulate (o Multiaddr ) Multiaddr {
151
+ func (m * multiaddr ) Decapsulate (o Multiaddr ) Multiaddr {
111
152
s1 := m .String ()
112
153
s2 := o .String ()
113
154
i := strings .LastIndex (s1 , s2 )
114
155
if i < 0 {
115
156
// if multiaddr not contained, returns a copy.
116
157
cpy := make ([]byte , len (m .bytes ))
117
158
copy (cpy , m .bytes )
118
- return multiaddr {bytes : cpy }
159
+ return & multiaddr {bytes : cpy }
119
160
}
120
161
121
162
ma , err := NewMultiaddr (s1 [:i ])
@@ -127,7 +168,7 @@ func (m multiaddr) Decapsulate(o Multiaddr) Multiaddr {
127
168
128
169
var ErrProtocolNotFound = fmt .Errorf ("protocol not found in multiaddr" )
129
170
130
- func (m multiaddr ) ValueForProtocol (code int ) (value string , err error ) {
171
+ func (m * multiaddr ) ValueForProtocol (code int ) (value string , err error ) {
131
172
err = ErrProtocolNotFound
132
173
ForEach (m , func (c Component ) bool {
133
174
if c .Protocol ().Code == code {
0 commit comments