package actions import ( "errors" "io" "log" "maps" "regexp" "slices" "github.com/hymkor/exregexp-go" "tomatentum.net/svg-templater/internal/database" "tomatentum.net/svg-templater/pkg/svg" ) type TemplateParameters struct { Id string Keys map[string]string } func Template(r *TemplateParameters) ([]byte, error) { mapkeys := slices.Collect(maps.Keys(r.Keys)) ok, err := verifyTemplate(r.Id, mapkeys) if err != nil { return nil, err } if !ok { return nil, errors.New("Template does not exist.") } log.Printf("Replacing keys of %s template\n", r.Id) reader, err := svg.Storage.Get(r.Id) if err != nil { return nil, err } defer reader.Close() svgblob, err := io.ReadAll(reader) if err != nil { return nil, err } replaceAll(&svgblob, r.Keys) log.Printf("Finished replacing keys of %s template\n", r.Id) return svgblob, nil } func replaceAll(svgblob *[]byte, keys map[string]string) { regex := regexp.MustCompile(svg.KeyRegex) *svgblob = []byte(exregexp.ReplaceAllStringSubmatchFunc(regex, string(*svgblob), func(s []string) string { log.Printf("Replacing key %s with %s\n", s[1], keys[s[1]]) return keys[s[1]] })) } func verifyTemplate(id string, keys []string) (bool, error) { data, err := database.GetSpecificSVG(id) if err != nil { return false, err } for _, key := range data.TemplateKeys { if !slices.Contains(keys, key) { return false, nil } } return true, nil }