// ParseMultiaddr parses a multiaddr into an IPFSAddr func ParseMultiaddr(m ma.Multiaddr) (a IPFSAddr, err error) { // never panic. defer func() { if r := recover(); r != nil { log.Debug("recovered from panic: ", r) a = nil err = ErrInvalidAddr } }() if m == nil { return nil, ErrInvalidAddr } // make sure it's an ipfs addr parts := ma.Split(m) if len(parts) < 1 { return nil, ErrInvalidAddr } ipfspart := parts[len(parts)-1] // last part if ipfspart.Protocols()[0].Code != ma.P_IPFS { return nil, ErrInvalidAddr } // make sure ipfs id parses as a peer.ID peerIdParts := strings.Split(ipfspart.String(), "/") peerIdStr := peerIdParts[len(peerIdParts)-1] id, err := peer.IDB58Decode(peerIdStr) if err != nil { return nil, err } return ipfsAddr{ma: m, id: id}, nil }
func TestIDMatches(t *testing.T) { for _, g := range good { a, err := ParseString(g) if err != nil { t.Error("failed to parse", g, err) continue } sp := strings.Split(g, "/") sid := sp[len(sp)-1] id, err := peer.IDB58Decode(sid) if err != nil { t.Error("failed to parse", sid, err) continue } if a.ID() != id { t.Error("not equal", a.ID(), id) } } }
func (qe *QueryEvent) UnmarshalJSON(b []byte) error { temp := struct { ID string Type int Responses []*peer.PeerInfo Extra string }{} err := json.Unmarshal(b, &temp) if err != nil { return err } if len(temp.ID) > 0 { pid, err := peer.IDB58Decode(temp.ID) if err != nil { return err } qe.ID = pid } qe.Type = QueryEventType(temp.Type) qe.Responses = temp.Responses qe.Extra = temp.Extra return nil }