package config 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 }