67 lines
1.4 KiB
Go
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
|
|
}
|