Enhance constructor for Prefix type.

This commit is contained in:
Kevin Atkinson
2018-07-26 17:57:34 -04:00
parent a0557075ec
commit 5547437445
2 changed files with 55 additions and 8 deletions

View File

@@ -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 {

View File

@@ -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)
}
}
}