package dns import ( "darvaza.org/core" "darvaza.org/resolver" "darvaza.org/slog" "git.jpi.io/amery/jpictl/pkg/cluster" ) // Manager is a DNS Manager instance type Manager struct { p Provider r resolver.Resolver l slog.Logger } // ManagerOption configures a Manager type ManagerOption func(*Manager) error func newErrorManagerOption(err error, hint string) ManagerOption { return func(*Manager) error { if hint != "" { err = core.Wrap(err, hint) } return err } } // WithProvider attaches a libdns Provider to the Manager func WithProvider(p Provider) ManagerOption { var err error if p == nil { p, err = DefaultDNSProvider() } if err != nil { return newErrorManagerOption(err, "WithProvider") } return func(mgr *Manager) error { mgr.p = p return nil } } // WithLookuper attaches a resolver.Lookuper to the Manager func WithLookuper(h resolver.Lookuper) ManagerOption { if h == nil { h = cluster.DefaultLookuper() } return func(mgr *Manager) error { mgr.r = resolver.NewResolver(h) return nil } } // WithResolver attaches a resolver.Resolver to the Manager func WithResolver(r resolver.Resolver) ManagerOption { if r == nil { r = cluster.DefaultResolver() } return func(mgr *Manager) error { mgr.r = r return nil } } // WithLogger attaches a logger to the Manager func WithLogger(log slog.Logger) ManagerOption { if log == nil { log = cluster.DefaultLogger() } return func(mgr *Manager) error { mgr.l = log return nil } } func (mgr *Manager) setDefaults() error { var opts []ManagerOption if mgr.p == nil { opts = append(opts, WithProvider(nil)) } if mgr.r == nil { opts = append(opts, WithResolver(nil)) } if mgr.l == nil { opts = append(opts, WithLogger(nil)) } for _, opt := range opts { if err := opt(mgr); err != nil { return err } } return nil } // NewManager creates a DNS manager with the func NewManager(opts ...ManagerOption) (*Manager, error) { mgr := new(Manager) for _, opt := range opts { if err := opt(mgr); err != nil { return nil, err } } if err := mgr.setDefaults(); err != nil { return nil, err } return mgr, nil }