aicra/internal/config/parser.go

109 lines
2.4 KiB
Go

package config
import (
"encoding/json"
"errors"
"git.xdrm.io/go/aicra/driver"
"os"
"path/filepath"
"strings"
)
// Parse extracts a Meta from a json config file (aicra.json)
func Parse(_path string) (*Schema, error) {
/* 1. ppen file */
file, err := os.Open(_path)
if err != nil {
return nil, errors.New("cannot open file")
}
defer file.Close()
/* 2. Init receiver dataset */
receiver := &Schema{}
/* 3. Decode json */
decoder := json.NewDecoder(file)
err = decoder.Decode(receiver)
if err != nil {
return nil, err
}
/* 4. Error on invalid driver */
receiver.DriverName = strings.ToLower(receiver.DriverName)
switch receiver.DriverName {
case "generic":
receiver.Driver = &driver.Generic{}
case "plugin":
receiver.Driver = &driver.Plugin{}
default:
return nil, errors.New("invalid driver; choose from 'generic', 'plugin'")
}
/* 5. Fail on absolute folders */
if len(receiver.Types.Folder) > 0 && filepath.IsAbs(receiver.Types.Folder) {
return nil, errors.New("types folder must be relative to root")
}
if len(receiver.Controllers.Folder) > 0 && filepath.IsAbs(receiver.Controllers.Folder) {
return nil, errors.New("controllers folder must be relative to root")
}
if len(receiver.Middlewares.Folder) > 0 && filepath.IsAbs(receiver.Middlewares.Folder) {
return nil, errors.New("middlewares folder must be relative to root")
}
/* 7. Format result (default values, etc) */
receiver.setDefaults()
return receiver, nil
}
// setDefaults sets defaults values and checks for missing data
func (m *Schema) setDefaults() {
// 1. extract absolute root folder
absroot, err := filepath.Abs(m.Root)
if err == nil {
m.Root = absroot
}
// 2. host
if len(m.Host) < 1 {
m.Host = Default.Host
}
// 3. port
if m.Port == 0 {
m.Port = Default.Port
}
// 4. Use default builders if not set
if m.Types == nil {
m.Types = Default.Types
}
if m.Controllers == nil {
m.Controllers = Default.Controllers
}
if m.Middlewares == nil {
m.Middlewares = Default.Middlewares
}
// 5. Use default folders if not set
if m.Types.Folder == "" {
m.Types.Folder = Default.Types.Folder
}
if m.Controllers.Folder == "" {
m.Controllers.Folder = Default.Controllers.Folder
}
if m.Middlewares.Folder == "" {
m.Middlewares.Folder = Default.Middlewares.Folder
}
// 6. Infer Maps from Folders
m.Types.InferFromFolder(m.Root, m.Driver)
m.Controllers.InferFromFolder(m.Root, m.Driver)
m.Middlewares.InferFromFolder(m.Root, m.Driver)
}