package config import ( "fmt" "os" "path/filepath" "strings" "gopkg.in/yaml.v3" ) type Config struct { Service struct { Host string `yaml:"host"` GRPCPort string `yaml:"grpc_port"` HTTPPort string `yaml:"http_port"` LogLevel string `yaml:"log_level"` } `yaml:"service"` Jaeger struct { Host string `yaml:"host"` Port string `yaml:"port"` } `yaml:"jaeger"` DatabaseMaster struct { Host string `yaml:"host"` Port string `yaml:"port"` User string `yaml:"user"` Password string `yaml:"password"` DBName string `yaml:"db_name"` } `yaml:"db_master"` DatabaseReplica struct { Host string `yaml:"host"` Port string `yaml:"port"` User string `yaml:"user"` Password string `yaml:"password"` DBName string `yaml:"db_name"` } `yaml:"db_replica"` Kafka struct { Host string `yaml:"host"` Port string `yaml:"port"` OrderTopic string `yaml:"order_topic"` Brokers string `yaml:"brokers"` } `yaml:"kafka"` } func LoadConfig(filename string) (*Config, error) { workDir, err := os.Getwd() if err != nil { return nil, err } cfgRoot := filepath.Join(workDir, "configs") absCfgRoot, _ := filepath.Abs(cfgRoot) filePath := filepath.Join(absCfgRoot, filepath.Clean(filename)) if !strings.HasPrefix(filePath, absCfgRoot) { return nil, fmt.Errorf("invalid path") } f, err := os.Open(filename) if err != nil { return nil, err } defer f.Close() config := &Config{} if err := yaml.NewDecoder(f).Decode(config); err != nil { return nil, err } return config, nil }