Skip to content

Commit

Permalink
✨ feat(str): add struct Builder for safe build string
Browse files Browse the repository at this point in the history
  • Loading branch information
inhere committed Feb 19, 2023
1 parent 8d5e4f4 commit b34245e
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 8 deletions.
82 changes: 74 additions & 8 deletions strutil/similar_find.go → strutil/ext.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package strutil

import (
"fmt"
"strings"
)

// SimilarComparator definition
//
// links:
//
// https://github.com/mkideal/cli/blob/master/fuzzy.go
Expand All @@ -13,6 +19,15 @@ func NewComparator(src, dst string) *SimilarComparator {
return &SimilarComparator{src, dst}
}

// Similarity calc for two string.
//
// Usage:
//
// rate, ok := Similarity("hello", "he")
func Similarity(s, t string, rate float32) (float32, bool) {
return NewComparator(s, t).Similar(rate)
}

// Similar by minDifferRate
// Usage:
//
Expand Down Expand Up @@ -56,22 +71,73 @@ func min(x, y float32) float32 {
if x < y {
return x
}

return y
}

func max(x, y int) int {
if x > y {
return x
}

return y
}

// Similarity calc for two string.
// Usage:
//
// rate, ok := Similarity("hello", "he")
func Similarity(s, t string, rate float32) (float32, bool) {
return NewComparator(s, t).Similar(rate)
// Builder struct
type Builder struct {
strings.Builder
}

// Write bytes and no error report
func (b *Builder) Write(p []byte) {
_, _ = b.Builder.Write(p)
}

// WriteRune and no error report
func (b *Builder) WriteRune(r rune) {
_, _ = b.Builder.WriteRune(r)
}

// WriteByteNE write byte and no error report
func (b *Builder) WriteByteNE(c byte) {
_ = b.WriteByte(c)
}

func (b *Builder) WriteString(s string) {
_, _ = b.Builder.WriteString(s)
}

// Writef write string by fmt.Sprintf formatted
func (b *Builder) Writef(tpl string, vs ...any) {
_, _ = b.Builder.WriteString(fmt.Sprintf(tpl, vs...))
}

// Writeln write string with newline.
func (b *Builder) Writeln(s string) {
_, _ = b.Builder.WriteString(s)
_ = b.WriteByte('\n')
}

// WriteAny write any type value.
func (b *Builder) WriteAny(v any) {
_, _ = b.Builder.WriteString(QuietString(v))
}

// WriteAnys write any type values.
func (b *Builder) WriteAnys(vs ...any) {
for _, v := range vs {
_, _ = b.Builder.WriteString(QuietString(v))
}
}

// WriteMulti write multi byte at once.
func (b *Builder) WriteMulti(bs ...byte) {
for _, b2 := range bs {
_ = b.WriteByte(b2)
}
}

// WriteStrings write multi string at once.
func (b *Builder) WriteStrings(ss ...string) {
for _, s := range ss {
_, _ = b.Builder.WriteString(s)
}
}
30 changes: 30 additions & 0 deletions strutil/ext_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package strutil_test

import (
"testing"

"github.com/gookit/goutil/strutil"
"github.com/gookit/goutil/testutil/assert"
)

func TestBuilder_WriteAny(t *testing.T) {
var sb strutil.Builder

sb.Writef("ab-%s", "c")
sb.WriteByteNE('d')
assert.Eq(t, "ab-cd", sb.String())

sb.Reset()
sb.WriteStrings("ab", "-", "cd")
sb.WriteString("-ef")
assert.Eq(t, "ab-cd-ef", sb.String())

sb.Reset()
sb.WriteAny("abc")
sb.WriteAnys(23, "def")
assert.Eq(t, "abc23def", sb.String())

sb.Reset()
sb.Writeln("abc")
assert.Eq(t, "abc\n", sb.String())
}

0 comments on commit b34245e

Please sign in to comment.