Skip to content

Commit

Permalink
refactor: 优化 Error 的实现
Browse files Browse the repository at this point in the history
  • Loading branch information
caixw committed Nov 23, 2023
1 parent 0a08823 commit 3ee43ad
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 19 deletions.
21 changes: 17 additions & 4 deletions phrase.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,11 @@ type (
values []any
}

localeError phrase
phraseError phrase

stringError struct {
key string
}

// StringPhrase 由字符串组成的 [Stringer] 实现
//
Expand All @@ -51,7 +55,10 @@ func Phrase(key string, val ...any) Stringer {
//
// 该对象同时实现了 [Stringer] 接口。
func Error(key string, val ...any) error {
return &localeError{key: key, values: val}
if len(val) == 0 {
return &stringError{key: key}
}
return &phraseError{key: key, values: val}
}

func (p phrase) LocaleString(printer *Printer) string {
Expand All @@ -70,12 +77,18 @@ func (p phrase) LocaleString(printer *Printer) string {
return printer.Sprintf(p.key, values...)
}

func (err *localeError) Error() string { return phrase(*err).LocaleString(nil) }
func (err *phraseError) Error() string { return err.LocaleString(nil) }

func (err *localeError) LocaleString(p *Printer) string {
func (err *phraseError) LocaleString(p *Printer) string {
return phrase(*err).LocaleString(p)
}

func (err *stringError) Error() string { return err.LocaleString(nil) }

func (err *stringError) LocaleString(p *Printer) string {
return StringPhrase(err.key).LocaleString(p)
}

func (sp StringPhrase) LocaleString(p *Printer) string {
if p == nil {
return string(sp)
Expand Down
41 changes: 26 additions & 15 deletions phrase_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,44 +17,46 @@ var (
_ Stringer = &phrase{}
_ Stringer = StringPhrase("123")

_ error = &localeError{}
_ Stringer = &localeError{}
_ error = &phraseError{}
_ Stringer = &phraseError{}

_ error = &stringError{}
_ Stringer = &stringError{}
)

func TestStringer(t *testing.T) {
a := assert.New(t, false)

a.NotError(message.SetString(language.SimplifiedChinese, "k1", "cn"))
a.NotError(message.SetString(language.TraditionalChinese, "k1", "tw"))
a.NotError(message.SetString(language.SimplifiedChinese, "k2", "cn %[1]s"))
a.NotError(message.SetString(language.TraditionalChinese, "k2", "tw %[1]s"))
a.NotError(message.SetString(language.SimplifiedChinese, "k2 %s", "cn %[1]s"))
a.NotError(message.SetString(language.TraditionalChinese, "k2 %s", "tw %[1]s"))
cnp := message.NewPrinter(language.SimplifiedChinese, message.Catalog(message.DefaultCatalog))
twp := message.NewPrinter(language.TraditionalChinese, message.Catalog(message.DefaultCatalog))

// 转换为 StringPhrase
p := Phrase("k1")
a.Equal(p.LocaleString(cnp), "cn")
a.Equal(p.LocaleString(twp), "tw")
a.Equal(p.LocaleString(nil), "k1")

p = Phrase("k2", p)
// phrase
p = Phrase("k2 %s", p)
a.Equal(p.LocaleString(cnp), "cn cn")
a.Equal(p.LocaleString(twp), "tw tw")
a.Equal(p.LocaleString(nil), "k2 k1")

p = Phrase("not-exists")
a.Equal(p.LocaleString(twp), "not-exists")

p = StringPhrase("not-exists")
a.Equal(p.LocaleString(twp), "not-exists")

p = StringPhrase("k1")
a.Equal(p.LocaleString(cnp), "cn")
a.Equal(p.LocaleString(twp), "tw")
}

func TestError(t *testing.T) {
a := assert.New(t, false)

a.NotError(message.SetString(language.SimplifiedChinese, "k1", "cn"))
a.NotError(message.SetString(language.TraditionalChinese, "k1", "tw"))
a.NotError(message.SetString(language.SimplifiedChinese, "k2 %s", "cn %[1]s"))
a.NotError(message.SetString(language.TraditionalChinese, "k2 %s", "tw %[1]s"))
cnp := message.NewPrinter(language.SimplifiedChinese, message.Catalog(message.DefaultCatalog))
twp := message.NewPrinter(language.TraditionalChinese, message.Catalog(message.DefaultCatalog))

Expand All @@ -65,18 +67,27 @@ func TestError(t *testing.T) {
a.Equal(le.LocaleString(twp), "tw")
a.Equal(err.Error(), "k1")

err = Error("k2 %s", err)
le, ok = err.(Stringer)
a.True(ok).NotNil(le)
a.Equal(le.LocaleString(cnp), "cn cn")
a.Equal(le.LocaleString(twp), "tw tw")
a.Equal(err.Error(), "k2 k1")

err = Error("not-exists")
le, ok = err.(Stringer)
a.True(ok).NotNil(le)
a.Equal(le.LocaleString(twp), "not-exists")

// errors.Is

err1 := Error("k1")
a.Equal(Error("k1"), err1)
a.ErrorIs(err1, err1)
a.ErrorIs(fmt.Errorf("err2 %w", err1), err1)
a.False(errors.Is(Error("k1"), Error("k1"))) // 非同一个对象,行为与 errors.New 是相同的
a.False(errors.Is(Error("k1 %d", 1), Error("k1 %d", 1)))
a.False(errors.Is(Error("k1 %d", 1), Error("k1 %d", 2)))
a.False(errors.Is(Error("k1"), Error("k1"))) // 非同一个对象,行为与 errors.New 是相同的
a.False(errors.Is(Error("k2 %d", 1), Error("k2 %d", 1))) // 参数相同的非同一对象
a.False(errors.Is(Error("k2 %d", 1), Error("k2 %d", 2)))
a.False(errors.Is(Error("k1"), errors.New("k1")))
}

Expand Down

0 comments on commit 3ee43ad

Please sign in to comment.