blob: 87cd8c469ebb1d7a34d5b853db9c337af49c6661 [file] [log] [blame]
Giorgi Lekveishvili7fb28bf2023-06-24 19:51:16 +04001package installer
2
3import (
4 "crypto/rand"
5 "fmt"
6)
7
8type NamespaceGenerator interface {
9 Generate(name string) (string, error)
10}
11
12type prefixGenerator struct {
13 prefix string
14}
15
16func NewPrefixGenerator(prefix string) NamespaceGenerator {
17 return &prefixGenerator{prefix}
18}
19
20func (g *prefixGenerator) Generate(name string) (string, error) {
21 return g.prefix + name, nil
22}
23
24type randomSuffixGenerator struct {
25 len int
26}
27
28func NewRandomSuffixGenerator(len int) NamespaceGenerator {
29 return &randomSuffixGenerator{len}
30}
31
32var letters = []rune("abcdefghijklmnopqrstuvwxyz")
33
34func (g randomSuffixGenerator) Generate(name string) (string, error) {
35 r := make([]byte, g.len)
36 if _, err := rand.Read(r); err != nil {
37 return "", err
38 }
39 ret := make([]rune, g.len)
40 for i, v := range r {
41 ret[i] += letters[v%26]
42 }
43 return fmt.Sprintf("%s-%s", name, string(ret)), nil
44}
45
46type combineGenerator struct {
47 ns []NamespaceGenerator
48}
49
50func NewCombine(ns ...NamespaceGenerator) NamespaceGenerator {
51 return &combineGenerator{ns}
52}
53
54func (g *combineGenerator) Generate(name string) (string, error) {
55 cur := name
56 var err error
57 for _, i := range g.ns {
58 cur, err = i.Generate(cur)
59 if err != nil {
60 return "", err
61 }
62 }
63 return cur, nil
64}