lib/email_inquire/validator/country_code_tld.rb
# frozen_string_literal: true
require "email_inquire/helper"
require "email_inquire/validator/base"
require "email_inquire/validator/common_provider"
module EmailInquire
module Validator
class CountryCodeTld < Base
COUNTRY_CODE_TLDS = [
# TLD, generic com, all generic, registration with TLD only is possible
["jp", "co", load_data("country_code_tld/jp").freeze, true].freeze,
["uk", "co", load_data("country_code_tld/uk").freeze, true].freeze,
["br", "com", load_data("country_code_tld/br").freeze, true].freeze,
].freeze
def initialize(email)
super(email)
*@rest, @sld, @tld = domain.split(".")
end
def validate
Helper.first_value(
COUNTRY_CODE_TLDS
) do |cctld, generic_com, all_generics, registration_with_cctld|
validate_cctld(cctld, generic_com, all_generics, registration_with_cctld)
end
end
private
attr_reader :rest, :sld, :tld
def hint_for_approx_cctld(cctld, all_generics)
matching_generic = all_generics.find { |generic| tld.eql?("#{generic}#{cctld}") }
return unless matching_generic
replacement = [*rest, sld, matching_generic, cctld].join(".")
response.hint!(domain: replacement)
end
def hint_for_common_provider(cctld, generic_com)
provider_domain = [
sld,
generic_com,
cctld,
].join(".")
return unless CommonProvider::DOMAINS.include?(provider_domain)
response.hint!(domain: provider_domain)
end
def hint_for_generic_com(cctld, generic_com)
replacement = [
*rest,
(sld if sld.length > 2),
generic_com,
cctld,
].compact.join(".")
response.hint!(domain: replacement)
end
def hint_for_generic_at_end_of_sld(cctld, all_generics)
generic_at_end_of_sld = all_generics.find { |generic| sld.end_with?(generic) }
return unless generic_at_end_of_sld
replacement = [
*rest,
sld.sub(/#{generic_at_end_of_sld}\z/, ""),
generic_at_end_of_sld,
cctld,
].join(".")
response.hint!(domain: replacement)
end
def validate_cctld(cctld, generic_com, all_generics, registration_with_cctld)
return hint_for_approx_cctld(cctld, all_generics) unless tld.eql?(cctld)
if all_generics.include?(sld)
return response.invalid! if rest.empty?
return
end
(
hint_for_generic_at_end_of_sld(cctld, all_generics) ||
hint_for_common_provider(cctld, generic_com)
).tap do |hint|
return hint if hint
end
hint_for_generic_com(cctld, generic_com) if sld.length <= 2 || !registration_with_cctld
end
end
end
end