package metal import ( "go.uber.org/zap" "go.equinixmetal.net/infra9-metal-bridge/internal/metal/providers" "go.equinixmetal.net/infra9-metal-bridge/internal/metal/providers/emapi" "go.equinixmetal.net/infra9-metal-bridge/internal/metal/providers/emgql" ) // Option is a Client configuration Option definition. type Option func(c *Client) error // WithProvider sets the provider on the client. func WithProvider(provider providers.Provider) Option { return func(c *Client) error { c.provider = provider return nil } } // WithLogger sets the logger for the client. func WithLogger(logger *zap.Logger) Option { return func(c *Client) error { c.logger = logger return nil } } // WithConfig applies all configurations defined in the config. func WithConfig(config Config) Option { return func(c *Client) error { var options []Option if config.EMGQL.Populated() { client, err := emgql.New(emgql.WithConfig(config.EMGQL)) if err != nil { return err } options = append(options, WithProvider(client)) } else if config.EMAPI.Populated() { client, err := emapi.New(emapi.WithConfig(config.EMAPI)) if err != nil { return err } options = append(options, WithProvider(client)) } for _, opt := range options { if err := opt(c); err != nil { return err } } return nil } }