Remove "magical" NewPrefix function, rename Prefix to Encoder.

This commit is contained in:
Kevin Atkinson
2018-07-26 20:55:47 -04:00
parent 5547437445
commit 2eb83a994b
3 changed files with 58 additions and 76 deletions

53
encoder.go Normal file
View File

@@ -0,0 +1,53 @@
package multibase
import (
"fmt"
)
// Encoder is a multibase encoding that is verified to be supported and
// supports an Encode method that does not return an error
type Encoder struct {
enc Encoding
}
// NewEncoder create a new Encoder from an Encoding
func NewEncoder(base Encoding) (Encoder, error) {
_, ok := EncodingToStr[base]
if !ok {
return Encoder{-1}, fmt.Errorf("Unsupported multibase encoding: %d", base)
}
return Encoder{base}, nil
}
// EncoderByName creates an encoder from a string, the string can
// either be the multibase name or single character multibase prefix
func EncoderByName(str string) (Encoder, error) {
var base Encoding
ok := true
if len(str) == 0 {
return Encoder{-1}, fmt.Errorf("Empty multibase encoding")
} else if len(str) == 1 {
base = Encoding(str[0])
_, ok = EncodingToStr[base]
} else {
base, ok = Encodings[str]
}
if !ok {
return Encoder{-1}, fmt.Errorf("Unsupported multibase encoding: %s", str)
}
return Encoder{base}, nil
}
func (p Encoder) Encoding() Encoding {
return p.enc
}
// Encode encodes the multibase using the given Encoder.
func (p Encoder) Encode(data []byte) string {
str, err := Encode(p.enc, data)
if err != nil {
// should not happen
panic(err)
}
return str
}

View File

@@ -5,24 +5,17 @@ import (
)
func TestInvalidPrefix(t *testing.T) {
_, err := NewPrefix('q')
_, err := NewEncoder('q')
if err == nil {
t.Error("expected failure")
}
}
func TestPrefix(t *testing.T) {
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)
prefix, err := NewEncoder(base)
if err != nil {
t.Fatalf("NewPrefix(%c) failed: %v", base, err)
t.Fatalf("NewEncoder(%c) failed: %v", base, err)
}
str1, err := Encode(base, sampleBytes)
if err != nil {
@@ -32,9 +25,9 @@ func TestPrefix(t *testing.T) {
if str1 != str2 {
t.Errorf("encoded string mismatch: %s != %s", str1, str2)
}
_, err = NewPrefix(str)
_, err = EncoderByName(str)
if err != nil {
t.Fatalf("NewPrefix(%s) failed: %v", str, err)
t.Fatalf("NewEncoder(%s) failed: %v", str, err)
}
}
}

View File

@@ -1,64 +0,0 @@
package multibase
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
}
// 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.")
}
_, 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 {
// should not happen
panic(err)
}
return str
}