updated ezconf
This commit is contained in:
@@ -16,14 +16,19 @@ type EnvVar struct {
|
||||
Group string // Group name for organizing variables (e.g., "Database", "Logging")
|
||||
}
|
||||
|
||||
// configStruct holds a config struct pointer and its group name for parsing
|
||||
type configStruct struct {
|
||||
configPtr any
|
||||
groupName string
|
||||
}
|
||||
|
||||
// ConfigLoader manages configuration loading from multiple sources
|
||||
type ConfigLoader struct {
|
||||
configFuncs map[string]ConfigFunc // Map of config names to ConfigFromEnv functions
|
||||
packagePaths []string // Paths to packages to parse for ENV comments
|
||||
groupNames map[string]string // Map of package paths to group names
|
||||
extraEnvVars []EnvVar // Additional environment variables to track
|
||||
envVars []EnvVar // All extracted environment variables
|
||||
configs map[string]any // Loaded configurations
|
||||
configFuncs map[string]ConfigFunc // Map of config names to ConfigFromEnv functions
|
||||
configStructs []configStruct // Config struct pointers for tag parsing
|
||||
extraEnvVars []EnvVar // Additional environment variables to track
|
||||
envVars []EnvVar // All extracted environment variables
|
||||
configs map[string]any // Loaded configurations
|
||||
}
|
||||
|
||||
// ConfigFunc is a function that loads configuration from environment variables
|
||||
@@ -32,12 +37,11 @@ type ConfigFunc func() (any, error)
|
||||
// New creates a new ConfigLoader
|
||||
func New() *ConfigLoader {
|
||||
return &ConfigLoader{
|
||||
configFuncs: make(map[string]ConfigFunc),
|
||||
packagePaths: make([]string, 0),
|
||||
groupNames: make(map[string]string),
|
||||
extraEnvVars: make([]EnvVar, 0),
|
||||
envVars: make([]EnvVar, 0),
|
||||
configs: make(map[string]any),
|
||||
configFuncs: make(map[string]ConfigFunc),
|
||||
configStructs: make([]configStruct, 0),
|
||||
extraEnvVars: make([]EnvVar, 0),
|
||||
envVars: make([]EnvVar, 0),
|
||||
configs: make(map[string]any),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,16 +58,20 @@ func (cl *ConfigLoader) AddConfigFunc(name string, fn ConfigFunc) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddPackagePath adds a package directory path to parse for ENV comments
|
||||
func (cl *ConfigLoader) AddPackagePath(path string) error {
|
||||
if path == "" {
|
||||
return errors.New("package path cannot be empty")
|
||||
// AddConfigStruct adds a config struct pointer for parsing ezconf tags.
|
||||
// The configPtr must be a pointer to a struct with ezconf struct tags.
|
||||
// The groupName is used for organizing environment variables in output.
|
||||
func (cl *ConfigLoader) AddConfigStruct(configPtr any, groupName string) error {
|
||||
if configPtr == nil {
|
||||
return errors.New("config pointer cannot be nil")
|
||||
}
|
||||
// Check if path exists
|
||||
if _, err := os.Stat(path); os.IsNotExist(err) {
|
||||
return errors.Errorf("package path does not exist: %s", path)
|
||||
if groupName == "" {
|
||||
groupName = "Other"
|
||||
}
|
||||
cl.packagePaths = append(cl.packagePaths, path)
|
||||
cl.configStructs = append(cl.configStructs, configStruct{
|
||||
configPtr: configPtr,
|
||||
groupName: groupName,
|
||||
})
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -72,27 +80,22 @@ func (cl *ConfigLoader) AddEnvVar(envVar EnvVar) {
|
||||
cl.extraEnvVars = append(cl.extraEnvVars, envVar)
|
||||
}
|
||||
|
||||
// ParseEnvVars extracts environment variables from packages and extra vars
|
||||
// This can be called without having actual environment variables set
|
||||
// ParseEnvVars extracts environment variables from config struct tags and extra vars.
|
||||
// This can be called without having actual environment variables set.
|
||||
func (cl *ConfigLoader) ParseEnvVars() error {
|
||||
// Clear existing env vars to prevent duplicates
|
||||
cl.envVars = make([]EnvVar, 0)
|
||||
|
||||
// Parse packages for ENV comments
|
||||
for _, pkgPath := range cl.packagePaths {
|
||||
envVars, err := ParseConfigPackage(pkgPath)
|
||||
// Parse config structs for ezconf tags
|
||||
for _, cs := range cl.configStructs {
|
||||
envVars, err := ParseConfigStruct(cs.configPtr)
|
||||
if err != nil {
|
||||
return errors.Wrapf(err, "failed to parse package: %s", pkgPath)
|
||||
}
|
||||
|
||||
// Set group name for these variables from stored mapping
|
||||
groupName := cl.groupNames[pkgPath]
|
||||
if groupName == "" {
|
||||
groupName = "Other"
|
||||
return errors.Wrap(err, "failed to parse config struct")
|
||||
}
|
||||
|
||||
// Set group name for these variables
|
||||
for i := range envVars {
|
||||
envVars[i].Group = groupName
|
||||
envVars[i].Group = cs.groupName
|
||||
}
|
||||
|
||||
cl.envVars = append(cl.envVars, envVars...)
|
||||
@@ -109,8 +112,8 @@ func (cl *ConfigLoader) ParseEnvVars() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// LoadConfigs executes the config functions to load actual configurations
|
||||
// This should be called after environment variables are properly set
|
||||
// LoadConfigs executes the config functions to load actual configurations.
|
||||
// This should be called after environment variables are properly set.
|
||||
func (cl *ConfigLoader) LoadConfigs() error {
|
||||
// Load configurations
|
||||
for name, fn := range cl.configFuncs {
|
||||
|
||||
Reference in New Issue
Block a user