diff --git a/prefix.go b/prefix.go index 92ad4f8..bdf2f1d 100644 --- a/prefix.go +++ b/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 { diff --git a/prefix_test.go b/prefix_test.go index e0214cd..642b9f4 100644 --- a/prefix_test.go +++ b/prefix_test.go @@ -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) + } } }