-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.go
61 lines (53 loc) · 2.28 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package config
import (
"context"
"net/http"
"strings"
"github.com/verygoodsoftwarenotvirus/starter/internal/email"
"github.com/verygoodsoftwarenotvirus/starter/internal/email/mailgun"
"github.com/verygoodsoftwarenotvirus/starter/internal/email/mailjet"
"github.com/verygoodsoftwarenotvirus/starter/internal/email/sendgrid"
"github.com/verygoodsoftwarenotvirus/starter/internal/observability/logging"
"github.com/verygoodsoftwarenotvirus/starter/internal/observability/tracing"
validation "github.com/go-ozzo/ozzo-validation/v4"
)
const (
// ProviderSendgrid represents SendGrid.
ProviderSendgrid = "sendgrid"
// ProviderMailgun represents Mailgun.
ProviderMailgun = "mailgun"
// ProviderMailjet represents Mailjet.
ProviderMailjet = "mailjet"
)
type (
// Config is the configuration structure.
Config struct {
Sendgrid *sendgrid.Config `json:"sendgrid" toml:"sendgrid,omitempty"`
Mailgun *mailgun.Config `json:"mailgun" toml:"mailgun,omitempty"`
Mailjet *mailjet.Config `json:"mailjet" toml:"mailjet,omitempty"`
Provider string `json:"provider" toml:"provider,omitempty"`
}
)
var _ validation.ValidatableWithContext = (*Config)(nil)
// ValidateWithContext validates a Config struct.
func (cfg *Config) ValidateWithContext(ctx context.Context) error {
return validation.ValidateStructWithContext(ctx, cfg,
validation.Field(&cfg.Sendgrid, validation.When(cfg.Provider == ProviderSendgrid, validation.Required)),
validation.Field(&cfg.Mailgun, validation.When(cfg.Provider == ProviderMailgun, validation.Required)),
validation.Field(&cfg.Mailjet, validation.When(cfg.Provider == ProviderMailjet, validation.Required)),
)
}
// ProvideEmailer provides an outbound_emailer.
func (cfg *Config) ProvideEmailer(logger logging.Logger, tracerProvider tracing.TracerProvider, client *http.Client) (email.Emailer, error) {
switch strings.ToLower(strings.TrimSpace(cfg.Provider)) {
case ProviderSendgrid:
return sendgrid.NewSendGridEmailer(cfg.Sendgrid, logger, tracerProvider, client)
case ProviderMailgun:
return mailgun.NewMailgunEmailer(cfg.Mailgun, logger, tracerProvider, client)
case ProviderMailjet:
return mailjet.NewMailjetEmailer(cfg.Mailjet, logger, tracerProvider, client)
default:
logger.Debug("providing noop outbound_emailer")
return email.NewNoopEmailer()
}
}