backend/Config.go (151 lines of code) (raw):

package backend import ( "bytes" "embed" "encoding/json" "html/template" "io/ioutil" "log" "os" "path" "reflect" ) //go:embed Config.gohtml var tmplFS embed.FS var ( ConfigurationOptions = Config{} defaultConfig = Config{ EditorFontSize: 12, EditorTheme: "system", } ConfigFileName = "config.json" ConfigDirectoryName = path.Clean("JetBrains/IntelliJLogAnalyzer") ) type Config struct { EditorFontSize int `json:"EditorFontSize"` EditorTheme string `json:"EditorTheme"` EditorDefaultSoftWrapState bool `json:"EditorDefaultSoftWrapState"` } func GetConfig() *Config { if ConfigurationOptions != *new(Config) { return &ConfigurationOptions } else { ConfigurationOptions = generateConfig() } return &ConfigurationOptions } func GetSettingsScreenHTML() string { config := GetConfig() var tpl bytes.Buffer t := template.Must(template.New("Config.gohtml"). ParseFS(tmplFS, "Config.gohtml")) err := t.Execute(&tpl, config) if err != nil { log.Printf("Template Config.gohtml execution failed. Error: %s", err.Error()) } return tpl.String() } func (c *Config) saveConfig() { configPath := getConfigFilePath() if !FileExists(configPath) { createConfig(configPath) } configFileContent, err := json.Marshal(c) if err != nil { log.Println("Error while marshalling config file content: ", err) } err = ioutil.WriteFile(configPath, configFileContent, 0644) if err != nil { log.Println("Error while writing config file: ", err) } } func (c *Config) SaveSetting(id string, value interface{}) { log.Printf("Saving setting '%s' with value '%v'", id, value) aValue := reflect.ValueOf(value) fields := reflect.VisibleFields(reflect.TypeOf(Config{})) for _, field := range fields { if aValue.CanConvert(field.Type) { if field.Name == id { reflect.ValueOf(c).Elem().FieldByName(field.Name).Set(aValue.Convert(field.Type)) } } } c.saveConfig() } func generateConfig() Config { configPath := getConfigFilePath() if !FileExists(configPath) { log.Printf("Could not open configuration file: %s \n Using default config", configPath) } configValues := getConfigValues(configPath) if configValues != *new(Config) { return configValues } else { return defaultConfig } } func getConfigValues(configPath string) Config { configFile, err := os.Open(configPath) if err != nil { log.Printf("Could not open configuration file: %s", configPath) return *new(Config) } defer configFile.Close() byteValue, _ := ioutil.ReadAll(configFile) var config Config json.Unmarshal(byteValue, &config) return config } func getConfigFilePath() string { return getConfigDir() + string(os.PathSeparator) + ConfigDirectoryName + string(os.PathSeparator) + ConfigFileName } func getConfigDir() string { configPath, err := os.UserConfigDir() if err != nil { log.Printf("Could not get system configuration directory: %v \n Checking config file in home directory", err) configPath, _ = os.UserHomeDir() } return configPath } func createConfig(configFilePath string) { configDir := path.Dir(configFilePath) if err, ConfigDirectoryExists := os.Stat(configDir); ConfigDirectoryExists == nil { log.Printf("Creating configuration file in %s", configDir) createConfigFile(configFilePath) } else { log.Printf("Could not find configuration directory: %v", err) err := createConfigDirectory(configDir) if err == nil { createConfigFile(configFilePath) } else { log.Printf("Could not create configuration directory: %v", err) } } } func createConfigFile(configFilePath string) { configFile, err := os.Create(configFilePath) defer func(configFile *os.File) { err := configFile.Close() if err != nil { log.Printf("Could not close configuration file: %v", err) } }(configFile) if err != nil { log.Printf("Could not create configuration file: %v", err) } log.Printf("Successfully created configuration file: %s", configFilePath) } func createConfigDirectory(path string) error { err := os.MkdirAll(path, os.ModePerm) if err != nil { log.Printf("Could not create configuration directory: %v", err) return err } return nil } func FileExists(path string) bool { _, err := os.Stat(path) if err != nil { return false } return true }