Files
svg-templater/pkg/svg/actions/template.go
Tueem 205b70eeab
All checks were successful
build / Go-Build (push) Successful in 1m38s
build / Go-Build (pull_request) Successful in 39s
feat(template): add Templating functionality and endpoint
2026-02-09 11:09:19 +01:00

67 lines
1.4 KiB
Go

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
}