vinegar/servlet/config.go

93 lines
2.0 KiB
Go

package servlet
import (
"encoding/json"
"errors"
"fmt"
"geniuscartel.xyz/vinegar/vinegarUtil"
)
type (
ConfigType string
ConfigEntry struct {
ConfigType ConfigType
UrlPattern string
FileLocation string
UseBuiltinCache bool
}
Config struct {
ListeningAddress string
Routes []ConfigEntry
}
)
const (
Text ConfigType = "Text"
Image = "Image"
SingleFile = "SingleFile"
)
func CreateBlankConfig() *Config {
conf := Config{
ListeningAddress: ":8080",
Routes: make([]ConfigEntry, 0, 10),
}
dummyRoute := ConfigEntry{
ConfigType: Text,
UrlPattern: "/*",
FileLocation: "errors/",
UseBuiltinCache: false,
}
conf.Routes = append(conf.Routes, dummyRoute)
return &conf
}
func LoadConfig(pathlike string) *VinegarServlet {
contents, exists := vinegarUtil.GetDiskContent(pathlike)
if exists {
conf := Config{}
err := json.Unmarshal(*contents, &conf)
if err != nil {
panic(err)
return nil
}
servlet := NewServlet(conf.ListeningAddress)
for _, v := range conf.Routes {
constructor, err := getConstructorFunction(v.ConfigType)
if err != nil {
panic(err)
return nil
}
//we don't have to invoke servlet.AddRoute because the static routes already do that for us
constructor(servlet, v.UrlPattern, v.FileLocation, v.UseBuiltinCache)
}
return servlet
}
panic("Could not find config file at" + pathlike)
return nil
}
func (e ConfigEntry) toRoute(serv *VinegarServlet) {
constructor, err := getConstructorFunction(e.ConfigType)
if err != nil {
panic(err)
}
constructor(serv, e.UrlPattern, e.FileLocation, e.UseBuiltinCache)
}
func getConstructorFunction(t ConfigType) (RouteConstructor, error) {
switch t {
case Text:
return NewTextRoute, nil
case Image:
return NewImageRoute, nil
case SingleFile:
return NewSingleFileRoute, nil
}
return nil, errors.New(fmt.Sprintf("could not determine constructor for invalid ConfigType: %s", t))
}