From bb1d0363f3114ad1656d042a80891f606df38214 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 15 Mar 2025 20:20:45 -0400 Subject: [PATCH] Pull out the function to read and parse config files and add some more error handling. --- config.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++-- main.go | 30 +++++------------------------- 2 files changed, 53 insertions(+), 27 deletions(-) diff --git a/config.go b/config.go index 8c2a9c9..a69c332 100644 --- a/config.go +++ b/config.go @@ -3,13 +3,40 @@ package main import ( "errors" "fmt" - _ "strconv" + "os" "strings" + + "github.com/hjson/hjson-go/v4" ) -// Configuration errors +// Errors 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 { Key string Value interface{} @@ -27,6 +54,25 @@ func undefinedError(key string) *ConfigError { 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 func (s ServiceConfig) GetHostPort() (string, error) { if s.Ports == nil { diff --git a/main.go b/main.go index 1b0c2f2..26ff08f 100644 --- a/main.go +++ b/main.go @@ -44,41 +44,21 @@ type ServiceConfig struct { } func main() { - var err error - var config Config - // Initialize structs for scripted configurations ScriptedInit() // Read user config file - { - file, err := os.ReadFile("goolinux.json") - if err != nil { - fmt.Println("Cannot read user config file") - fmt.Println(err) - return - } - - err = hjson.Unmarshal(file, &config) - if err != nil { - fmt.Println(err) - return - } + config, err := ParseConfig("goolinux.json") + if err != nil { + fmt.Println(err) + return } // Read system "base" config file if it exists if config.System.Base != "" { - var systemConfig Config fp := "services/" + config.System.Base + ".json" - file, err := os.ReadFile(fp) - if err != nil { - fmt.Println("Cannot read system base config file") - fmt.Println(err) - return - } - - err = hjson.Unmarshal(file, &systemConfig) + systemConfig, err := ParseConfig(fp) if err != nil { fmt.Println(err) return