diff --git a/internal/config/config.go b/internal/config/config.go index feabf80..e78f8e9 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -1,14 +1,12 @@ package config import ( - "caatsm/pkg/utils" "fmt" "os" "regexp" "strings" "github.com/spf13/viper" - // Adjust this import based on your project structure ) var MyConfig *Config @@ -17,7 +15,6 @@ type Config struct { Nats NatsConfig Subscription SubscriptionConfig Timeouts TimeoutsConfig - Body []BodyConfig } type NatsConfig struct { @@ -27,7 +24,7 @@ type NatsConfig struct { } type SubscriptionConfig struct { - Topic string + Topic string `mapstructure:"topic"` QueueGroup string `mapstructure:"queue_group"` } @@ -39,7 +36,6 @@ type TimeoutsConfig struct { } type BodyConfig struct { - Name string Patterns []PatternConfig } @@ -49,6 +45,38 @@ type PatternConfig struct { Expression *regexp.Regexp } +// Define the regex patterns as constants +const ( + arrPatternString = `^\((?P[A-Z]{3})-(?P[A-Z0-9]+)-(?P[A-Z0-9]+)-(?P[A-Z]{4})-(?P[A-Z]{4})\)$` + depPatternString = `^\((?P[A-Z]{3})-(?P[A-Z0-9]+)-(?P[A-Z0-9]+)-(?P[A-Z]{4})-(?P\d{4})-(?P[A-Z]{4})\)$` +) + +// Initialize the bodyPatterns map +var bodyPatterns = map[string]BodyConfig{ + "ARR": { + Patterns: []PatternConfig{ + { + Pattern: arrPatternString, + Comments: "Pattern for ARR message", + Expression: regexp.MustCompile(arrPatternString), + }, + }, + }, + "DEP": { + Patterns: []PatternConfig{ + { + Pattern: depPatternString, + Comments: "Pattern for DEP message", + Expression: regexp.MustCompile(depPatternString), + }, + }, + }, +} + +func GetBodyPatterns() map[string]BodyConfig { + return bodyPatterns +} + func SetMyConfig(cfg *Config) { MyConfig = cfg } @@ -57,7 +85,7 @@ func GetMyConfig() *Config { if MyConfig == nil { cfg, err := LoadConfig() if err != nil { - utils.Logger.Fatalf("error loading config: %v", err) + fmt.Printf("error loading config: %v", err) } MyConfig = cfg } @@ -66,12 +94,12 @@ func GetMyConfig() *Config { // LoadConfig loads the configuration from a file func LoadConfig() (*Config, error) { - log := utils.Logger + // log := utils.Logger env := os.Getenv("GO_ENV") if env == "" { env = "dev" } - log.Infof("Environment: %s", env) + // log.Infof("Environment: %s", env) viper.SetConfigType("toml") viper.SetConfigName("config." + env) @@ -81,84 +109,42 @@ func LoadConfig() (*Config, error) { if err := viper.ReadInConfig(); err != nil { errMsg := fmt.Sprintf("error reading config file for environment '%s': %v", env, err) - log.Error(errMsg) + // log.Error(errMsg) return nil, fmt.Errorf(errMsg) } - log.Debug("Config file read successfully") - log.Debugf("Config keys: %v", viper.AllKeys()) + // log.Debug("Config file read successfully") + // log.Debugf("Config keys: %v", viper.AllKeys()) var config Config if err := viper.Unmarshal(&config); err != nil { errMsg := fmt.Sprintf("unable to decode config into struct for environment '%s': %v", env, err) - log.Error(errMsg) + // log.Error(errMsg) return nil, fmt.Errorf(errMsg) } - log.Debugf("Config loaded before regex compilation: %+v", config) - - // Compile regex patterns - for i := range config.Body { - for j := range config.Body[i].Patterns { - name := config.Body[i].Name - pattern := config.Body[i].Patterns[j].Pattern - expr, err := regexp.Compile(pattern) - if err != nil { - errMsg := fmt.Sprintf("error compiling regex for body '%s', pattern '%s': %v", name, pattern, err) - log.Error(errMsg) - return nil, fmt.Errorf(errMsg) - } - config.Body[i].Patterns[j].Expression = expr - } - } - - log.Debugf("Final config after regex compilation: %+v", config) + // log.Debugf("Config loaded: %+v", config) return &config, nil } // ValidateConfig validates the loaded configuration func ValidateConfig(cfg *Config) error { - log := utils.Logger + // log := utils.Logger if cfg.Nats.Client == "" { - err := "nats client is required" - log.Error(err) - return fmt.Errorf(err) + return fmt.Errorf("nats client is required") } if cfg.Nats.URL == "" { - err := "nats URL is required" - log.Error(err) - return fmt.Errorf(err) + return fmt.Errorf("nats URL is required") } if cfg.Subscription.Topic == "" { - err := "subscription topic is required" - log.Error(err) - return fmt.Errorf(err) + return fmt.Errorf("subscription topic is required") } - if len(cfg.Body) == 0 { - err := "at least one body configuration is required" - log.Error(err) - return fmt.Errorf(err) - } - for _, body := range cfg.Body { - if body.Name == "" { - err := "body name is required" - log.Error(err) - return fmt.Errorf(err) - } - for _, pattern := range body.Patterns { - if pattern.Pattern == "" { - err := fmt.Sprintf("pattern is required for body '%s'", body.Name) - log.Error(err) - return fmt.Errorf(err) - } - if pattern.Expression == nil { - err := fmt.Sprintf("compiled expression is missing for pattern '%s' in body '%s'", pattern.Pattern, body.Name) - log.Error(err) - return fmt.Errorf(err) - } - } - } - log.Info("config validation passed") + fmt.Println("config validation passed") return nil } + +// func logAndReturnError(log *logrus.Logger, msg string) error { +// log.Error(msg) +// return fmt.Errorf(msg) +// } diff --git a/internal/config/config_test.go b/internal/config/config_test.go index 6fed31c..033a90c 100644 --- a/internal/config/config_test.go +++ b/internal/config/config_test.go @@ -2,11 +2,11 @@ package config import ( "os" - "path/filepath" "testing" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" + "github.com/spf13/viper" ) func TestConfig(t *testing.T) { @@ -20,32 +20,10 @@ var _ = Describe("Config", func() { BeforeEach(func() { // Save the original GO_ENV value originalEnv = os.Getenv("GO_ENV") - }) - - AfterEach(func() { - // Restore the original GO_ENV value - os.Setenv("GO_ENV", originalEnv) - }) - - // Helper function to create temporary TOML files in the "configs" directory - createTempConfigFile := func(env, content string) string { - dir := "configs" - err := os.MkdirAll(dir, 0755) - Expect(err).NotTo(HaveOccurred(), "failed to create config directory") - - filename := filepath.Join(dir, "config."+env+".toml") - tmpfile, err := os.Create(filename) - Expect(err).NotTo(HaveOccurred(), "failed to create temp config file") - _, err = tmpfile.Write([]byte(content)) - Expect(err).NotTo(HaveOccurred(), "failed to write to temp config file") - err = tmpfile.Close() - Expect(err).NotTo(HaveOccurred(), "failed to close temp config file") - return filename - } - - Context("Loading and validating a valid TOML file", func() { - It("should load and validate the configuration correctly", func() { - content := ` + // Set up a temporary configuration file for testing + viper.Reset() + viper.SetConfigType("toml") + configContent := ` [nats] client = "test-client" url = "nats://localhost:4222" @@ -60,69 +38,68 @@ server_timeout = "30s" reconnect_wait = "10s" close_timeout = "10s" ack_wait_timeout = "5s" - -[[body]] -name = "FPL" -[[body.patterns]] -pattern = "^\\((?P[A-Z]{3})\\-(?P[A-Z]+\\d+)\\-(?P[A-Z]{2})(?:.*\\s*)?\\-(?P[A-Z]+\\d+/?[A-Z]?)\\s*\\-(?P.*)\\s*\\-(?P[A-Z]{4})(?P\\d{4})\\s*\\-(?P[A-Z]+\\d+)(?P[A-Z0-9]+)\\s(?P.*)\\s*\\-(?P[A-Z]{4})(?P\\d{4})\\s(?P[A-Z]{4})\\s*\\-(?PPBN\\/[A-Z0-9]+)\\s(?P