func WithConnectionPoolMaxIdleTime(fn func(time.Duration) time.Duration) ServerOption {
	return func(cfg *serverConfig) error {
		cfg.connectionPoolMaxIdleTime = fn(cfg.connectionPoolMaxIdleTime)
		return nil
	}
}
WithConnectionPoolMaxIdleTime configures the maximum time that a connection can remain idle in the connection pool
before being removed. If connectionPoolMaxIdleTime is 0, then no idle time is set and connections will not be removed
because of their age
package topology
import (
	"time"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/bson/bsoncodec"
	"go.mongodb.org/mongo-driver/event"
	"go.mongodb.org/mongo-driver/x/mongo/driver/session"
)
var defaultRegistry = bson.NewRegistryBuilder().Build()
type serverConfig struct {
	clock                     *session.ClusterClock
	compressionOpts           []string
	connectionOpts            []ConnectionOption
	appname                   string
	heartbeatInterval         time.Duration
	heartbeatTimeout          time.Duration
	maxConns                  uint64
	minConns                  uint64
	poolMonitor               *event.PoolMonitor
	serverMonitor             *event.ServerMonitor
	connectionPoolMaxIdleTime time.Duration
	registry                  *bsoncodec.Registry
	monitoringDisabled        bool
}
func newServerConfig(opts ...ServerOption) (*serverConfig, error) {
	cfg := &serverConfig{
		heartbeatInterval: 10 * time.Second,
		heartbeatTimeout:  10 * time.Second,
		maxConns:          100,
		registry:          defaultRegistry,
	}
	for _, opt := range opts {
		err := opt(cfg)
		if err != nil {
			return nil, err
		}
	}
	return cfg, nil
}
type ServerOption func(*serverConfig) error
func withMonitoringDisabled(fn func(bool) bool) ServerOption {
	return func(cfg *serverConfig) error {
		cfg.monitoringDisabled = fn(cfg.monitoringDisabled)
		return nil
	}
}
func WithConnectionOptions(fn func(...ConnectionOption) []ConnectionOption) ServerOption {
	return func(cfg *serverConfig) error {
		cfg.connectionOpts = fn(cfg.connectionOpts...)
		return nil
	}
}
func WithCompressionOptions(fn func(...string) []string) ServerOption {
	return func(cfg *serverConfig) error {
		cfg.compressionOpts = fn(cfg.compressionOpts...)
		return nil
	}
}
func WithServerAppName(fn func(string) string) ServerOption {
	return func(cfg *serverConfig) error {
		cfg.appname = fn(cfg.appname)
		return nil
	}
}
func WithHeartbeatInterval(fn func(time.Duration) time.Duration) ServerOption {
	return func(cfg *serverConfig) error {
		cfg.heartbeatInterval = fn(cfg.heartbeatInterval)
		return nil
	}
}
func WithHeartbeatTimeout(fn func(time.Duration) time.Duration) ServerOption {
	return func(cfg *serverConfig) error {
		cfg.heartbeatTimeout = fn(cfg.heartbeatTimeout)
		return nil
	}
}
func WithMaxConnections(fn func(uint64) uint64) ServerOption {
	return func(cfg *serverConfig) error {
		cfg.maxConns = fn(cfg.maxConns)
		return nil
	}
}
func WithMinConnections(fn func(uint64) uint64) ServerOption {
	return func(cfg *serverConfig) error {
		cfg.minConns = fn(cfg.minConns)
		return nil
	}
}