package ezconf type Integration struct { Name string ConfigPointer any ConfigFunc func() (any, error) GroupName string } func NewIntegration(name, groupname string, cfgptr any, cfgfunc func() (any, error)) *Integration { return &Integration{ name, cfgptr, cfgfunc, groupname, } } // IntegrationDepr is an interface that packages can implement to provide // easy integration with ezconf type IntegrationDepr interface { // Name returns the name to use when registering the config Name() string // ConfigPointer returns a pointer to the config struct for tag parsing ConfigPointer() any // ConfigFunc returns the ConfigFromEnv function ConfigFunc() func() (any, error) // GroupName returns the display name for grouping environment variables GroupName() string } // AddIntegration registers a package using an Integration object returned by another package func (cl *ConfigLoader) AddIntegration(integration *Integration) error { // Add config struct for tag parsing configPtr := integration.ConfigPointer if err := cl.AddConfigStruct(configPtr, integration.GroupName); err != nil { return err } // Add config function if err := cl.AddConfigFunc(integration.Name, integration.ConfigFunc); err != nil { return err } return nil } // AddIntegrations registers multiple integrations at once func (cl *ConfigLoader) AddIntegrations(integrations ...*Integration) error { for _, integration := range integrations { if err := cl.AddIntegration(integration); err != nil { return err } } return nil } // RegisterIntegration registers a package that implements the Integration interface func (cl *ConfigLoader) RegisterIntegration(integration IntegrationDepr) error { // Add config struct for tag parsing configPtr := integration.ConfigPointer() if err := cl.AddConfigStruct(configPtr, integration.GroupName()); err != nil { return err } // Add config function if err := cl.AddConfigFunc(integration.Name(), integration.ConfigFunc()); err != nil { return err } return nil } // RegisterIntegrations registers multiple integrations at once func (cl *ConfigLoader) RegisterIntegrations(integrations ...IntegrationDepr) error { for _, integration := range integrations { if err := cl.RegisterIntegration(integration); err != nil { return err } } return nil }