Files
godoxy-yusing/internal/notif/config.go
yusing 6da7227f9b refactor(errs): migrate from gperr.Error to standard Go error interface
This is a large-scale refactoring across the codebase that replaces the custom
`gperr.Error` type with Go's standard `error` interface. The changes include:

- Replacing `gperr.Error` return types with `error` in function signatures
- Using `errors.New()` and `fmt.Errorf()` instead of `gperr.New()` and `gperr.Errorf()`
- Using `%w` format verb for error wrapping instead of `.With()` method
- Replacing `gperr.Subject()` calls with `gperr.PrependSubject()`
- Converting error logging from `gperr.Log*()` functions to zerolog's `.Err().Msg()` pattern
- Update NewLogger to handle multiline error message
- Updating `goutils` submodule to latest commit

This refactoring aligns with Go idioms and removes the dependency on
custom error handling abstractions in favor of standard library patterns.
2026-02-08 12:07:36 +08:00

53 lines
1.3 KiB
Go

package notif
import (
"errors"
"strings"
"github.com/yusing/godoxy/internal/serialization"
gperr "github.com/yusing/goutils/errs"
)
type NotificationConfig struct {
ProviderName string `json:"provider"`
Provider Provider `json:"-"`
}
var (
ErrMissingNotifProvider = errors.New("missing notification provider")
ErrInvalidNotifProviderType = errors.New("invalid notification provider type")
ErrUnknownNotifProvider = errors.New("unknown notification provider")
)
// UnmarshalMap implements MapUnmarshaler.
func (cfg *NotificationConfig) UnmarshalMap(m map[string]any) (err 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{}
case ProviderNtfy:
cfg.Provider = &Ntfy{}
default:
return gperr.PrependSubject(ErrUnknownNotifProvider, cfg.ProviderName).
Withf("expect %s", strings.Join(AvailableProviders, ", "))
}
return serialization.MapUnmarshalValidate(m, cfg.Provider)
}