package settings import ( "encoding/json" "fmt" "os" "strings" ) type Settings struct { Port string StaticLocation string TemplatesLocation string ArticlesLocation string } const settingsLocation = "Settings.json" var defaultSettings = Settings { Port: ":6969", StaticLocation: "../static", TemplatesLocation: "../templates", ArticlesLocation: "../articles", } var Current Settings = Settings{} func ReadSettings() { var file, fopenerr = os.ReadFile(settingsLocation) if fopenerr != nil { var success, inintBody = createSettingsFile() if success { file = inintBody } else { panic(fmt.Sprintf("Unable to load or create settings file. \nOriginal error: %v\n", fopenerr.Error())) } } var data = Settings{} json.Unmarshal(file, &data) var validationErr = data.Validate() if validationErr != nil { panic(fmt.Sprintf("Failed to load settings file: %s", validationErr.Error())) } Current = data } func createSettingsFile() (bool, []byte ) { var file, err = os.Create(settingsLocation) if err != nil { return false, nil } defer file.Close() var inititalData = defaultSettings var body, jsonerr = json.MarshalIndent(inititalData, "", " ") if jsonerr != nil { return false, nil } fmt.Fprint(file, string(body)) return true, body } // Returns an error with the issue description if the settings are invalid func (base *Settings) Validate() error { if len(base.Port) == 0 || !strings.Contains(base.Port, ":") { return fmt.Errorf("The port string is invalid") } return nil }