Files
go-caatsm/internal/config/config.go
T
windyboy 969bb57902 feat: Add AFTN message parsing functionality
This commit adds functionality to parse AFTN messages in the `aftn_parser.go` file. The `Parse` method now correctly parses the message based on its type and extracts the relevant data. Additionally, the `FindPatterns` and `ParseBody` functions have been updated to remove the dependency on the `config` package and instead use the `config.GetBodyPatterns` function to retrieve the body patterns. This change improves the modularity and maintainability of the code.

Note: This commit message assumes that the `config` package has been refactored to use the `GetBodyPatterns` function.
2024-07-20 00:01:04 +08:00

151 lines
3.4 KiB
Go

package config
import (
"fmt"
"os"
"regexp"
"strings"
"github.com/spf13/viper"
)
var MyConfig *Config
type Config struct {
Nats NatsConfig
Subscription SubscriptionConfig
Timeouts TimeoutsConfig
}
type NatsConfig struct {
Client string
URL string
Cluster string
}
type SubscriptionConfig struct {
Topic string `mapstructure:"topic"`
QueueGroup string `mapstructure:"queue_group"`
}
type TimeoutsConfig struct {
ServerTimeout string `mapstructure:"server_timeout"`
ReconnectWait string `mapstructure:"reconnect_wait"`
CloseTimeout string `mapstructure:"close_timeout"`
AckWaitTimeout string `mapstructure:"ack_wait_timeout"`
}
type BodyConfig struct {
Patterns []PatternConfig
}
type PatternConfig struct {
Pattern string
Comments string
Expression *regexp.Regexp
}
// Define the regex patterns as constants
const (
arrPatternString = `^\((?P<type>[A-Z]{3})-(?P<number>[A-Z0-9]+)-(?P<ssr>[A-Z0-9]+)-(?P<departure>[A-Z]{4})-(?P<arrival>[A-Z]{4})\)$`
depPatternString = `^\((?P<type>[A-Z]{3})-(?P<number>[A-Z0-9]+)-(?P<ssr>[A-Z0-9]+)-(?P<departure>[A-Z]{4})-(?P<departure_time>\d{4})-(?P<arrival>[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
}
func GetMyConfig() *Config {
if MyConfig == nil {
cfg, err := LoadConfig()
if err != nil {
fmt.Printf("error loading config: %v", err)
}
MyConfig = cfg
}
return MyConfig
}
// LoadConfig loads the configuration from a file
func LoadConfig() (*Config, error) {
// log := utils.Logger
env := os.Getenv("GO_ENV")
if env == "" {
env = "dev"
}
// log.Infof("Environment: %s", env)
viper.SetConfigType("toml")
viper.SetConfigName("config." + env)
viper.AddConfigPath("configs")
viper.SetEnvPrefix("tele")
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
if err := viper.ReadInConfig(); err != nil {
errMsg := fmt.Sprintf("error reading config file for environment '%s': %v", env, err)
// log.Error(errMsg)
return nil, fmt.Errorf(errMsg)
}
// 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)
return nil, fmt.Errorf(errMsg)
}
// log.Debugf("Config loaded: %+v", config)
return &config, nil
}
// ValidateConfig validates the loaded configuration
func ValidateConfig(cfg *Config) error {
// log := utils.Logger
if cfg.Nats.Client == "" {
return fmt.Errorf("nats client is required")
}
if cfg.Nats.URL == "" {
return fmt.Errorf("nats URL is required")
}
if cfg.Subscription.Topic == "" {
return fmt.Errorf("subscription topic is required")
}
fmt.Println("config validation passed")
return nil
}
// func logAndReturnError(log *logrus.Logger, msg string) error {
// log.Error(msg)
// return fmt.Errorf(msg)
// }