diff --git a/encoder.go b/encoder.go new file mode 100644 index 0000000..d1f87f0 --- /dev/null +++ b/encoder.go @@ -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 +} diff --git a/prefix_test.go b/encoder_test.go similarity index 57% rename from prefix_test.go rename to encoder_test.go index 642b9f4..714ba02 100644 --- a/prefix_test.go +++ b/encoder_test.go @@ -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) } } } diff --git a/prefix.go b/prefix.go deleted file mode 100644 index bdf2f1d..0000000 --- a/prefix.go +++ /dev/null @@ -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 -}