mirror of
https://github.com/tarampampam/error-pages.git
synced 2024-08-30 18:22:40 +00:00
106 lines
2.4 KiB
Go
106 lines
2.4 KiB
Go
|
package config
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"slices"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type templates map[string]string // map[name]content
|
||
|
|
||
|
// Add adds a new template.
|
||
|
func (tpl templates) Add(name, content string) error {
|
||
|
if name == "" {
|
||
|
return fmt.Errorf("template name cannot be empty")
|
||
|
}
|
||
|
|
||
|
tpl[name] = content
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// AddFromFile reads the file content and adds it as a new template.
|
||
|
func (tpl templates) AddFromFile(path string, name ...string) (addedTemplateName string, _ error) {
|
||
|
// check if the file exists and is not a directory
|
||
|
if stat, err := os.Stat(path); err != nil {
|
||
|
if os.IsNotExist(err) {
|
||
|
return "", fmt.Errorf("file %s not found", path)
|
||
|
}
|
||
|
|
||
|
return "", err
|
||
|
} else if stat.IsDir() {
|
||
|
return "", fmt.Errorf("%s is not a file", path)
|
||
|
}
|
||
|
|
||
|
// read the file content
|
||
|
var content, err = os.ReadFile(path)
|
||
|
if err != nil {
|
||
|
return "", fmt.Errorf("cannot read file %s: %w", path, err)
|
||
|
}
|
||
|
|
||
|
var templateName string
|
||
|
|
||
|
if len(name) > 0 && name[0] != "" { // if the name is provided, use it
|
||
|
templateName = name[0]
|
||
|
} else { // otherwise, use the file name without the extension
|
||
|
var (
|
||
|
fileName = filepath.Base(path)
|
||
|
ext = filepath.Ext(fileName)
|
||
|
)
|
||
|
|
||
|
if ext != "" && fileName != ext {
|
||
|
templateName = strings.TrimSuffix(fileName, ext)
|
||
|
} else {
|
||
|
templateName = fileName
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// add the template to the config
|
||
|
tpl[templateName] = string(content)
|
||
|
|
||
|
return templateName, nil
|
||
|
}
|
||
|
|
||
|
// Names returns all template names sorted alphabetically.
|
||
|
func (tpl templates) Names() []string {
|
||
|
var names = make([]string, 0, len(tpl))
|
||
|
|
||
|
for name := range tpl {
|
||
|
names = append(names, name)
|
||
|
}
|
||
|
|
||
|
slices.Sort(names)
|
||
|
|
||
|
return names
|
||
|
}
|
||
|
|
||
|
// Has checks if the template with the specified name exists.
|
||
|
func (tpl templates) Has(name string) (found bool) { _, found = tpl[name]; return } //nolint:nlreturn
|
||
|
|
||
|
// Get returns the template content by the specified name, if it exists.
|
||
|
func (tpl templates) Get(name string) (data string, ok bool) { data, ok = tpl[name]; return } //nolint:nlreturn
|
||
|
|
||
|
// Remove deletes the template by the specified name.
|
||
|
func (tpl templates) Remove(name string) (ok bool) {
|
||
|
if _, ok = tpl[name]; ok {
|
||
|
delete(tpl, name)
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// RandomName picks a random template name. It returns an empty string if there are no templates.
|
||
|
func (tpl templates) RandomName() string {
|
||
|
if len(tpl) == 0 {
|
||
|
return ""
|
||
|
}
|
||
|
|
||
|
for name := range tpl { // map iteration order is unpredictable (random) by design
|
||
|
return name
|
||
|
}
|
||
|
|
||
|
return ""
|
||
|
}
|