diff --git a/nodeid/nodeid.go b/nodeid/nodeid.go new file mode 100644 index 0000000..3f01db6 --- /dev/null +++ b/nodeid/nodeid.go @@ -0,0 +1,58 @@ +package nodeid + +import ( + "bytes" + "errors" + "git.lumeweb.com/LumeWeb/libs5-go/internal/bases" + "github.com/multiformats/go-multibase" +) + +var ( + errorNotBase58BTC = errors.New("not a base58btc string") +) + +type NodeId struct { + Bytes []byte +} + +func New(bytes []byte) *NodeId { + return &NodeId{Bytes: bytes} +} + +func Decode(nodeId string) (*NodeId, error) { + encoding, ret, err := multibase.Decode(nodeId) + if err != nil { + return nil, err + } + + if encoding != multibase.Base58BTC { + return nil, errorNotBase58BTC + } + + return New(ret), nil +} + +func (nodeId *NodeId) Equals(other interface{}) bool { + if otherNodeId, ok := other.(*NodeId); ok { + return bytes.Equal(nodeId.Bytes, otherNodeId.Bytes) + } + return false +} + +func (nodeId *NodeId) HashCode() int { + if len(nodeId.Bytes) < 4 { + return 0 + } + return int(nodeId.Bytes[0]) + + int(nodeId.Bytes[1])<<8 + + int(nodeId.Bytes[2])<<16 + + int(nodeId.Bytes[3])<<24 +} + +func (nodeId *NodeId) ToBase58() (string, error) { + return bases.ToBase58BTC(nodeId.Bytes) +} + +func (nodeId *NodeId) ToString() (string, error) { + return nodeId.ToBase58() +}