From 70fe1ab91eebb6b3472e4d29d4b9c3c71f259c69 Mon Sep 17 00:00:00 2001 From: writerpass Date: Thu, 23 Jan 2025 16:00:50 +0800 Subject: [PATCH] initial commit --- config-configure-type.go | 10 ++++ config-configure.go | 101 +++++++++++++++++++++++++++++++++++++++ go.mod | 3 ++ main.go | 26 ++++++++++ path-helper.go | 39 +++++++++++++++ 5 files changed, 179 insertions(+) create mode 100644 config-configure-type.go create mode 100644 config-configure.go create mode 100644 go.mod create mode 100644 main.go create mode 100644 path-helper.go diff --git a/config-configure-type.go b/config-configure-type.go new file mode 100644 index 0000000..45ed2d8 --- /dev/null +++ b/config-configure-type.go @@ -0,0 +1,10 @@ +package main + +type ConfigContainerType string + +const ( + BesidesExe ConfigContainerType = "besides-exe" + UserConfig ConfigContainerType = "user-config" + SystemConfig ConfigContainerType = "system-config" + None ConfigContainerType = "" +) diff --git a/config-configure.go b/config-configure.go new file mode 100644 index 0000000..e8eac9c --- /dev/null +++ b/config-configure.go @@ -0,0 +1,101 @@ +package main + +import ( + "encoding/json" + "log" + "os" + "path/filepath" + "reflect" +) + +type ConfigConfigure struct { + AppName string + ContainerType ConfigContainerType + ContainerPath string + ConfigureFile string +} + +func (receiver *ConfigConfigure) Check() { + if receiver.ContainerType == None { + log.Fatal("Check, ContainerType should not be None or empty ") + } else if receiver.ContainerType == BesidesExe { + // pass + } else if receiver.ContainerType == UserConfig { + if receiver.AppName == "" { + log.Fatal("Check, AppName should not be None while ContainerType == UserConfig") + } + } else if receiver.ContainerType == SystemConfig { + if receiver.AppName == "" { + log.Fatal("Check, AppName should not be None while ContainerType == SystemConfig\nBesides SystemConfig is not supported for now") + } + } +} + +func (receiver *ConfigConfigure) MakeupContainerPath() { + if receiver.ContainerType == None { + log.Fatal("Error making container path, ContainerType must be specified") + } else if receiver.ContainerType == BesidesExe { + receiver.ContainerPath = getConfigContainerBesidesExe() + } else if receiver.ContainerType == UserConfig { + receiver.ContainerPath = getConfigContainerUserConfig(receiver.AppName) + } else if receiver.ContainerType == SystemConfig { + log.Fatal("Error making container path, SystemConfig is not supported for now") + } +} + +func (receiver *ConfigConfigure) EnsureContainer() { + if receiver.ContainerPath == "" { + log.Fatal("Error ensuring container, ContainerPath should not be empty") + } + + // 检查目录是否存在 + if _, err := os.Stat(receiver.ContainerPath); os.IsNotExist(err) { + // 如果目录不存在,则创建 + err := os.MkdirAll(receiver.ContainerPath, 0755) + if err != nil { + log.Fatal("Failed to create container directory: ", err) + } + log.Printf("Container directory created: %s", receiver.ContainerPath) + } else if err != nil { + log.Fatal("Failed to check container directory: ", err) + } else { + log.Printf("Container directory already exists: %s", receiver.ContainerPath) + } +} + +func (receiver *ConfigConfigure) EnsureConfigure(defaultConfig interface{}) interface{} { + // makeup config file full path + configFile := filepath.Join(receiver.ContainerPath, receiver.ConfigureFile) + + // 检查配置文件是否存在 + if _, err := os.Stat(configFile); err == nil { + // 配置文件存在,读取并反序列化到目标结构体 + data, err := os.ReadFile(configFile) + if err != nil { + log.Fatalf("Failed to read config file: %v", err) + } + + // 使用反射获取 defaultConfig 的类型 + val := reflect.New(reflect.TypeOf(defaultConfig)).Interface() + if err := json.Unmarshal(data, val); err != nil { + log.Fatalf("Failed to unmarshal config file: %v", err) + } + log.Printf("Loaded config from file: %s", configFile) + return reflect.ValueOf(val).Elem().Interface() + } else if os.IsNotExist(err) { + // 配置文件不存在,保存默认配置到文件 + jsonData, err := json.MarshalIndent(defaultConfig, "", " ") + if err != nil { + log.Fatalf("Error encoding default config: %v", err) + } + if err := os.WriteFile(configFile, jsonData, 0644); err != nil { + log.Fatalf("Failed to write default config to file: %v", err) + } + log.Printf("Saved default config to file: %s", configFile) + return defaultConfig + } else { + // 其他错误 + log.Fatalf("Error checking config file: %v", err) + } + return defaultConfig +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..6b0ad03 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module json-configure + +go 1.23 diff --git a/main.go b/main.go new file mode 100644 index 0000000..9c0a53a --- /dev/null +++ b/main.go @@ -0,0 +1,26 @@ +package main + +import "log" + +type AppConfig struct { + AppName string `json:"app_name"` + AppVersion string `json:"app_version"` +} + +func main() { + configure := AppConfig{ + AppName: "aaaaa", + } + cc := ConfigConfigure{ + AppName: "json-configure", + ContainerType: BesidesExe, + ConfigureFile: "config.json", + } + cc.Check() + cc.MakeupContainerPath() + log.Println("Configure Container Path:", cc.ContainerPath) + cc.EnsureContainer() + configure = cc.EnsureConfigure(configure).(AppConfig) + log.Println("AppName:", configure.AppName) + log.Println("AppVersion:", configure.AppVersion) +} diff --git a/path-helper.go b/path-helper.go new file mode 100644 index 0000000..e3d5861 --- /dev/null +++ b/path-helper.go @@ -0,0 +1,39 @@ +package main + +import ( + "log" + "os" + "path/filepath" +) + +// should return the dir path of the exe file +func getConfigContainerBesidesExe() string { + if os.Getenv("DEBUG") == "true" { + path, err := os.Getwd() + if err != nil { + log.Fatal("Failed to Get Work Dir", err) + } + return path + } else { + executablePath, err := os.Executable() + if err != nil { + log.Fatal("Failed to Get Executable Path", err) + } + executableDir := filepath.Dir(executablePath) + return executableDir + } +} + +func getConfigContainerUserConfig(appName string) string { + dir, err := os.UserConfigDir() + if err != nil { + log.Fatal("Failed to Get User Config Dir", err) + } + dir = filepath.Join(dir, appName) + return dir +} + +func getConfigContainerSystemConfig(appName string) string { + log.Fatal("Error, not implemented yet") + return "" +}