class Kafka::SaslAuthenticator

def authenticate!(connection)

def authenticate!(connection)
  return unless enabled?
  ident = @mechanism.ident
  response = connection.send_request(Kafka::Protocol::SaslHandshakeRequest.new(ident))
  unless response.error_code == 0 && response.enabled_mechanisms.include?(ident)
    raise Kafka::Error, "#{ident} is not supported."
  end
  @mechanism.authenticate!(connection.to_s, connection.encoder, connection.decoder)
end

def enabled?

def enabled?
  !@mechanism.nil?
end

def initialize(logger:, sasl_gssapi_principal:, sasl_gssapi_keytab:,

def initialize(logger:, sasl_gssapi_principal:, sasl_gssapi_keytab:,
               sasl_plain_authzid:, sasl_plain_username:, sasl_plain_password:,
               sasl_scram_username:, sasl_scram_password:, sasl_scram_mechanism:)
  @logger = logger
  @plain = Sasl::Plain.new(
    authzid: sasl_plain_authzid,
    username: sasl_plain_username,
    password: sasl_plain_password,
    logger: @logger,
  )
  @gssapi = Sasl::Gssapi.new(
    principal: sasl_gssapi_principal,
    keytab: sasl_gssapi_keytab,
    logger: @logger,
  )
  @scram = Sasl::Scram.new(
    username: sasl_scram_username,
    password: sasl_scram_password,
    mechanism: sasl_scram_mechanism,
    logger: @logger,
  )
  @mechanism = [@gssapi, @plain, @scram].find(&:configured?)
end