diff --git a/unpack.go b/unpack.go index ea9a1bd..8412ea1 100644 --- a/unpack.go +++ b/unpack.go @@ -21,9 +21,6 @@ func Unpack(str string) (string, error) { var currentState state = start var result strings.Builder numOfRepeat := 1 - //if firstCheckString(&str) == true { - // return "", ErrInvalidString - //} var runeArray = []rune(str) @@ -38,6 +35,13 @@ func Unpack(str string) (string, error) { if unicode.IsDigit(char) { currentState = number numOfRepeat, _ = strconv.Atoi(string(char)) + repStr, err := repeatRune(runeArray[i-1], numOfRepeat) + if err != nil { + res := result.String() + result.Reset() + result.WriteString(res[0 : len(res)-1]) + } + result.WriteString(repStr) } else if char == '\\' { currentState = escape } else { @@ -48,18 +52,11 @@ func Unpack(str string) (string, error) { if unicode.IsDigit(char) { return "", ErrInvalidString } - repStr, err := repeatRune(runeArray[i-2], numOfRepeat) - if err != nil { - res := result.String() - result.Reset() - result.WriteString(res[0 : len(res)-1]) - } - result.WriteString(repStr) currentState = start result.WriteRune(char) case escape: result.WriteRune(char) - + currentState = start } } diff --git a/unpack_test.go b/unpack_test.go index fb26729..62d46a8 100644 --- a/unpack_test.go +++ b/unpack_test.go @@ -16,6 +16,10 @@ func TestUnpack(t *testing.T) { {input: "abccd", expected: "abccd"}, {input: "", expected: ""}, {input: "aaa0b", expected: "aab"}, + {input: "a2", expected: "aa"}, + {input: "aa", expected: "aa"}, + {input: "a", expected: "a"}, + {input: "d\n5abc", expected: "d\n\n\n\n\nabc"}, {input: `qwe\4\5`, expected: `qwe45`}, {input: `qwe\45`, expected: `qwe44444`}, {input: `qwe\\5`, expected: `qwe\\\\\`}, @@ -33,7 +37,7 @@ func TestUnpack(t *testing.T) { } func TestUnpackInvalidString(t *testing.T) { - invalidStrings := []string{"3abc", "45", "aaa10b"} + invalidStrings := []string{"3abc", "45", "aaa10b", "1"} for _, tc := range invalidStrings { tc := tc t.Run(tc, func(t *testing.T) {