|
|
|
class Person
|
|
|
|
attr_reader :id, :git, :phone, :telegram, :email
|
|
|
|
|
|
|
|
def initialize(id:, git: nil, phone: nil, telegram: nil, email: nil)
|
|
|
|
self.class.validate_id(id)
|
|
|
|
self.phone = phone
|
|
|
|
self.telegram = telegram
|
|
|
|
self.email = email
|
|
|
|
raise ArgumentError, "Необходимо указать хотя бы один контакт (телефон, Telegram или email)" unless contact_present?
|
|
|
|
|
|
|
|
@id = id
|
|
|
|
@git = git
|
|
|
|
end
|
|
|
|
|
|
|
|
def git_present?
|
|
|
|
!@git.nil? && !@git.empty?
|
|
|
|
end
|
|
|
|
|
|
|
|
def contact_present?
|
|
|
|
@phone || @telegram || @email
|
|
|
|
end
|
|
|
|
|
|
|
|
def contact_info
|
|
|
|
[@phone, @telegram, @email].compact.join(', ')
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.valid_phone_number?(phone)
|
|
|
|
/\A\+?[0-9]{9,15}\z/.match?(phone)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.valid_telegram?(telegram)
|
|
|
|
/\A@[A-Za-z0-9_]{5,32}\z/.match?(telegram)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.valid_email?(email)
|
|
|
|
/\A[^@\s]+@[^@\s]+\.[^@\s]+\z/.match?(email)
|
|
|
|
end
|
|
|
|
|
|
|
|
def phone=(phone)
|
|
|
|
if phone && !self.class.valid_phone_number?(phone)
|
|
|
|
raise ArgumentError, "Недопустимый номер телефона: #{phone}"
|
|
|
|
end
|
|
|
|
@phone = phone
|
|
|
|
end
|
|
|
|
|
|
|
|
def telegram=(telegram)
|
|
|
|
if telegram && !self.class.valid_telegram?(telegram)
|
|
|
|
raise ArgumentError, "Некорректный Telegram: #{telegram}"
|
|
|
|
end
|
|
|
|
@telegram = telegram
|
|
|
|
end
|
|
|
|
|
|
|
|
def email=(email)
|
|
|
|
if email && !self.class.valid_email?(email)
|
|
|
|
raise ArgumentError, "Некорректный email: #{email}"
|
|
|
|
end
|
|
|
|
@email = email
|
|
|
|
end
|
|
|
|
|
|
|
|
def git=(git)
|
|
|
|
self.class.validate_git(git)
|
|
|
|
@git = git
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.validate_id(id)
|
|
|
|
raise ArgumentError, 'ID is required and must be a non-empty string' unless valid_id?(id)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.validate_git(git)
|
|
|
|
raise ArgumentError, 'Git link is required' if git.nil? || git.strip.empty?
|
|
|
|
raise ArgumentError, 'Invalid Git link format' unless valid_git?(git)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.valid_git?(git)
|
|
|
|
/\Ahttps:\/\/github\.com\/[A-Za-z0-9_\-]+\z/.match?(git)
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.valid_id?(id)
|
|
|
|
id.is_a?(String) && !id.strip.empty?
|
|
|
|
end
|
|
|
|
end
|