package domain import ( "net/url" "slices" ) type BaseServer struct { key string url *url.URL open bool } func NewBaseServer(key, rawURL string, open bool) (BaseServer, error) { if err := validateServerKey(key); err != nil { return BaseServer{}, ValidationError{ Err: err, Field: "key", } } u, err := parseURL(rawURL) if err != nil { return BaseServer{}, ValidationError{ Err: err, Field: "url", } } return BaseServer{ key: key, url: u, open: open, }, nil } func (b BaseServer) Key() string { return b.key } func (b BaseServer) URL() *url.URL { return b.url } func (b BaseServer) Open() bool { return b.open } func (b BaseServer) IsZero() bool { return b == BaseServer{} } type BaseServers []BaseServer func (ss BaseServers) FilterOutSpecial(specials Servers) BaseServers { res := make(BaseServers, 0, len(ss)) for _, s := range ss { if slices.ContainsFunc(specials, func(special Server) bool { return special.Special() && special.Key() == s.Key() }) { continue } res = append(res, s) } return res }