module RedisClient::Config::Common

def initialize(

def initialize(
  username: nil,
  password: nil,
  db: nil,
  id: nil,
  timeout: DEFAULT_TIMEOUT,
  read_timeout: timeout,
  write_timeout: timeout,
  connect_timeout: timeout,
  ssl: nil,
  custom: {},
  ssl_params: nil,
  driver: nil,
  protocol: 3,
  client_implementation: RedisClient,
  command_builder: CommandBuilder,
  inherit_socket: false,
  reconnect_attempts: false,
  middlewares: false,
  circuit_breaker: nil
)
  @username = username
  @password = password && !password.respond_to?(:call) ? ->(_) { password } : password
  @db = begin
    Integer(db || DEFAULT_DB)
  rescue ArgumentError
    raise ArgumentError, "db: must be an Integer, got: #{db.inspect}"
  end
  @id = id
  @ssl = ssl || false
  @ssl_params = ssl_params
  @connect_timeout = connect_timeout
  @read_timeout = read_timeout
  @write_timeout = write_timeout
  @driver = driver ? RedisClient.driver(driver) : RedisClient.default_driver
  @custom = custom
  @client_implementation = client_implementation
  @protocol = protocol
  unless protocol == 2 || protocol == 3
    raise ArgumentError, "Unknown protocol version #{protocol.inspect}, expected 2 or 3"
  end
  @command_builder = command_builder
  @inherit_socket = inherit_socket
  reconnect_attempts = Array.new(reconnect_attempts, 0).freeze if reconnect_attempts.is_a?(Integer)
  @reconnect_attempts = reconnect_attempts
  circuit_breaker = CircuitBreaker.new(**circuit_breaker) if circuit_breaker.is_a?(Hash)
  if @circuit_breaker = circuit_breaker
    middlewares = [CircuitBreaker::Middleware] + (middlewares || [])
  end
  middlewares_stack = Middlewares
  if middlewares && !middlewares.empty?
    middlewares_stack = Class.new(Middlewares)
    middlewares.each do |mod|
      middlewares_stack.include(mod)
    end
  end
  @middlewares_stack = middlewares_stack
end