Enhance constructor for Prefix type.
This commit is contained in:
48
prefix.go
48
prefix.go
@@ -1,23 +1,59 @@
|
||||
package multibase
|
||||
|
||||
import ()
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Prefix is a multibase encoding that is verified to be supported and
|
||||
// supports an Encode method that does not return an error
|
||||
type Prefix struct {
|
||||
enc Encoding
|
||||
}
|
||||
|
||||
func NewPrefix(e Encoding) (Prefix, error) {
|
||||
_, err := Encode(e, nil)
|
||||
if err != nil {
|
||||
return Prefix{-1}, err
|
||||
// NewPrefix create a new Prefix type from either an Encoding or a
|
||||
// string. If nil or an empty string the default base (currently
|
||||
// Base58BTC) will be used.
|
||||
func NewPrefix(e interface{}) (Prefix, error) {
|
||||
base := Encoding(Base58BTC)
|
||||
switch v := e.(type) {
|
||||
case byte:
|
||||
base = Encoding(v)
|
||||
case rune:
|
||||
base = Encoding(v)
|
||||
case int:
|
||||
base = Encoding(v)
|
||||
case Encoding:
|
||||
base = v
|
||||
case string:
|
||||
ok := true
|
||||
// note: if empty string use default value
|
||||
if len(v) == 1 {
|
||||
base = Encoding(v[0])
|
||||
_, ok = EncodingToStr[base]
|
||||
} else if len(v) > 1 {
|
||||
base, ok = Encodings[v]
|
||||
}
|
||||
if !ok {
|
||||
return Prefix{-1}, fmt.Errorf("Unsupported multibase encoding: %s", v)
|
||||
}
|
||||
return Prefix{base}, nil
|
||||
case nil:
|
||||
/* use default value */
|
||||
default:
|
||||
return Prefix{-1}, fmt.Errorf("Unsupported parameter type.")
|
||||
}
|
||||
return Prefix{e}, nil
|
||||
_, ok := EncodingToStr[base]
|
||||
if !ok {
|
||||
return Prefix{-1}, fmt.Errorf("Unsupported multibase encoding: %d", base)
|
||||
}
|
||||
return Prefix{base}, nil
|
||||
}
|
||||
|
||||
func (p Prefix) Encoding() Encoding {
|
||||
return p.enc
|
||||
}
|
||||
|
||||
// Encode encodes the multibase using the given Prefix.
|
||||
func (p Prefix) Encode(data []byte) string {
|
||||
str, err := Encode(p.enc, data)
|
||||
if err != nil {
|
||||
|
||||
@@ -12,8 +12,15 @@ func TestInvalidPrefix(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestPrefix(t *testing.T) {
|
||||
for _, base := range Encodings {
|
||||
prefix,err := NewPrefix(base)
|
||||
prefix,err := NewPrefix(nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if prefix.Encoding() != Base58BTC {
|
||||
t.Error("unexpected default encoding")
|
||||
}
|
||||
for str, base := range Encodings {
|
||||
prefix,err = NewPrefix(base)
|
||||
if err != nil {
|
||||
t.Fatalf("NewPrefix(%c) failed: %v", base, err)
|
||||
}
|
||||
@@ -25,5 +32,9 @@ func TestPrefix(t *testing.T) {
|
||||
if str1 != str2 {
|
||||
t.Errorf("encoded string mismatch: %s != %s", str1, str2)
|
||||
}
|
||||
_, err = NewPrefix(str)
|
||||
if err != nil {
|
||||
t.Fatalf("NewPrefix(%s) failed: %v", str, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user