1package object
2
3import (
4 "crypto/rand"
5 "fmt"
6)
7
8const unambiguousAlphabet = "abcdefghjkmnpqrstvwxyz"
9
10func NewChangeID(length int) string {
11 b := make([]byte, length)
12 _, err := rand.Read(b)
13 if err != nil {
14 panic(fmt.Sprintf("change ID: rand.Read failed: %v", err))
15 }
16 out := make([]byte, length)
17 al := byte(len(unambiguousAlphabet))
18 for i, byt := range b {
19 out[i] = unambiguousAlphabet[byt%al]
20 }
21 return string(out)
22}
23
24func FormatChangeID(id string) string {
25 return "ch:" + id
26}
27
28func StripChangeIDPrefix(id string) string {
29 if len(id) >= 3 && id[:3] == "ch:" {
30 return id[3:]
31 }
32 return id
33}