mirror of
https://github.com/yusing/godoxy.git
synced 2025-05-20 20:52:33 +02:00
54 lines
1.3 KiB
Go
54 lines
1.3 KiB
Go
package notif
|
|
|
|
import (
|
|
E "github.com/yusing/go-proxy/internal/error"
|
|
"github.com/yusing/go-proxy/internal/utils"
|
|
)
|
|
|
|
type NotificationConfig struct {
|
|
ProviderName string `json:"provider"`
|
|
Provider Provider `json:"-"`
|
|
}
|
|
|
|
var (
|
|
ErrMissingNotifProvider = E.New("missing notification provider")
|
|
ErrInvalidNotifProviderType = E.New("invalid notification provider type")
|
|
ErrUnknownNotifProvider = E.New("unknown notification provider")
|
|
)
|
|
|
|
// UnmarshalMap implements MapUnmarshaler.
|
|
func (cfg *NotificationConfig) UnmarshalMap(m map[string]any) (err E.Error) {
|
|
// extract provider name
|
|
providerName := m["provider"]
|
|
switch providerName := providerName.(type) {
|
|
case string:
|
|
cfg.ProviderName = providerName
|
|
default:
|
|
return ErrInvalidNotifProviderType
|
|
}
|
|
delete(m, "provider")
|
|
|
|
if cfg.ProviderName == "" {
|
|
return ErrMissingNotifProvider
|
|
}
|
|
|
|
// validate provider name and initialize provider
|
|
switch cfg.ProviderName {
|
|
case ProviderWebhook:
|
|
cfg.Provider = &Webhook{}
|
|
case ProviderGotify:
|
|
cfg.Provider = &GotifyClient{}
|
|
default:
|
|
return ErrUnknownNotifProvider.
|
|
Subject(cfg.ProviderName).
|
|
Withf("expect %s or %s", ProviderWebhook, ProviderGotify)
|
|
}
|
|
|
|
// unmarshal provider config
|
|
if err := utils.Deserialize(m, cfg.Provider); err != nil {
|
|
return err
|
|
}
|
|
|
|
// validate provider
|
|
return cfg.Provider.Validate()
|
|
}
|