Pull out the function to read and parse config files and add some more error handling.
This commit is contained in:
parent
b3df846212
commit
bb1d0363f3
50
config.go
50
config.go
|
@ -3,13 +3,40 @@ package main
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
_ "strconv"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"github.com/hjson/hjson-go/v4"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Configuration errors
|
// Errors
|
||||||
var ErrUndefined = errors.New("value not defined")
|
var ErrUndefined = errors.New("value not defined")
|
||||||
|
var ErrFileNotFound = errors.New("file not found")
|
||||||
|
var ErrParse = errors.New("file could not be parsed")
|
||||||
|
|
||||||
|
// File and parsing errors
|
||||||
|
type ParseError struct{
|
||||||
|
File string
|
||||||
|
Err error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *ParseError) Error() string {
|
||||||
|
return fmt.Sprintf("Error parsing configuration file %s: %s",
|
||||||
|
e.File, e.Err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *ParseError) Unwrap() error { return e.Err }
|
||||||
|
|
||||||
|
func fileNotFoundError(file string) *ParseError {
|
||||||
|
return &ParseError{file, ErrFileNotFound}
|
||||||
|
}
|
||||||
|
|
||||||
|
func parsingError(file string) *ParseError {
|
||||||
|
return &ParseError{file, ErrParse}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Config struct errors
|
||||||
type ConfigError struct {
|
type ConfigError struct {
|
||||||
Key string
|
Key string
|
||||||
Value interface{}
|
Value interface{}
|
||||||
|
@ -27,6 +54,25 @@ func undefinedError(key string) *ConfigError {
|
||||||
return &ConfigError{key, nil, ErrUndefined}
|
return &ConfigError{key, nil, ErrUndefined}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func ParseConfig(file string) (Config, error) {
|
||||||
|
var err error
|
||||||
|
var c Config
|
||||||
|
|
||||||
|
fp, err := os.ReadFile(file)
|
||||||
|
if err != nil {
|
||||||
|
return Config{}, fileNotFoundError(file)
|
||||||
|
}
|
||||||
|
|
||||||
|
err = hjson.Unmarshal(fp, &c)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
return Config{}, parsingError(file)
|
||||||
|
}
|
||||||
|
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
|
||||||
// Get the first host port from a service
|
// Get the first host port from a service
|
||||||
func (s ServiceConfig) GetHostPort() (string, error) {
|
func (s ServiceConfig) GetHostPort() (string, error) {
|
||||||
if s.Ports == nil {
|
if s.Ports == nil {
|
||||||
|
|
30
main.go
30
main.go
|
@ -44,41 +44,21 @@ type ServiceConfig struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var err error
|
|
||||||
var config Config
|
|
||||||
|
|
||||||
// Initialize structs for scripted configurations
|
// Initialize structs for scripted configurations
|
||||||
ScriptedInit()
|
ScriptedInit()
|
||||||
|
|
||||||
// Read user config file
|
// Read user config file
|
||||||
{
|
config, err := ParseConfig("goolinux.json")
|
||||||
file, err := os.ReadFile("goolinux.json")
|
if err != nil {
|
||||||
if err != nil {
|
fmt.Println(err)
|
||||||
fmt.Println("Cannot read user config file")
|
return
|
||||||
fmt.Println(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err = hjson.Unmarshal(file, &config)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read system "base" config file if it exists
|
// Read system "base" config file if it exists
|
||||||
if config.System.Base != "" {
|
if config.System.Base != "" {
|
||||||
var systemConfig Config
|
|
||||||
fp := "services/" + config.System.Base + ".json"
|
fp := "services/" + config.System.Base + ".json"
|
||||||
|
|
||||||
file, err := os.ReadFile(fp)
|
systemConfig, err := ParseConfig(fp)
|
||||||
if err != nil {
|
|
||||||
fmt.Println("Cannot read system base config file")
|
|
||||||
fmt.Println(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
err = hjson.Unmarshal(file, &systemConfig)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
return
|
return
|
||||||
|
|
Loading…
Reference in a new issue