|
@@ -8,7 +8,6 @@ import (
|
|
|
"encoding/binary"
|
|
|
"errors"
|
|
|
"fmt"
|
|
|
- "regexp"
|
|
|
"strings"
|
|
|
|
|
|
"github.com/calmh/luhn"
|
|
@@ -155,16 +154,17 @@ func luhnify(s string) (string, error) {
|
|
|
panic("unsupported string length")
|
|
|
}
|
|
|
|
|
|
- res := make([]string, 0, 4)
|
|
|
+ res := make([]byte, 4*(13+1))
|
|
|
for i := 0; i < 4; i++ {
|
|
|
p := s[i*13 : (i+1)*13]
|
|
|
+ copy(res[i*(13+1):], p)
|
|
|
l, err := luhn.Base32.Generate(p)
|
|
|
if err != nil {
|
|
|
return "", err
|
|
|
}
|
|
|
- res = append(res, fmt.Sprintf("%s%c", p, l))
|
|
|
+ res[(i+1)*(13)+i] = byte(l)
|
|
|
}
|
|
|
- return res[0] + res[1] + res[2] + res[3], nil
|
|
|
+ return string(res), nil
|
|
|
}
|
|
|
|
|
|
func unluhnify(s string) (string, error) {
|
|
@@ -172,25 +172,31 @@ func unluhnify(s string) (string, error) {
|
|
|
return "", fmt.Errorf("%q: unsupported string length %d", s, len(s))
|
|
|
}
|
|
|
|
|
|
- res := make([]string, 0, 4)
|
|
|
+ res := make([]byte, 52)
|
|
|
for i := 0; i < 4; i++ {
|
|
|
- p := s[i*14 : (i+1)*14-1]
|
|
|
+ p := s[i*(13+1) : (i+1)*(13+1)-1]
|
|
|
+ copy(res[i*13:], p)
|
|
|
l, err := luhn.Base32.Generate(p)
|
|
|
if err != nil {
|
|
|
return "", err
|
|
|
}
|
|
|
- if g := fmt.Sprintf("%s%c", p, l); g != s[i*14:(i+1)*14] {
|
|
|
+ if s[(i+1)*14-1] != byte(l) {
|
|
|
return "", fmt.Errorf("%q: check digit incorrect", s)
|
|
|
}
|
|
|
- res = append(res, p)
|
|
|
}
|
|
|
- return res[0] + res[1] + res[2] + res[3], nil
|
|
|
+ return string(res), nil
|
|
|
}
|
|
|
|
|
|
func chunkify(s string) string {
|
|
|
- s = regexp.MustCompile("(.{7})").ReplaceAllString(s, "$1-")
|
|
|
- s = strings.Trim(s, "-")
|
|
|
- return s
|
|
|
+ chunks := len(s) / 7
|
|
|
+ res := make([]byte, chunks*(7+1)-1)
|
|
|
+ for i := 0; i < chunks; i++ {
|
|
|
+ if i > 0 {
|
|
|
+ res[i*(7+1)-1] = '-'
|
|
|
+ }
|
|
|
+ copy(res[i*(7+1):], s[i*7:(i+1)*7])
|
|
|
+ }
|
|
|
+ return string(res)
|
|
|
}
|
|
|
|
|
|
func unchunkify(s string) string {
|