class Contact # add setters with validation attr_reader :phone, :telegram, :email def initialize(args = {}) phone = args[:phone] telegram = args[:telegram] email = args[:email] raise ArgumentError, "Недопустимый номер телефона: #{phone}" if phone && !valid_phone_number?(phone) raise ArgumentError, "Некорректный Telegram: #{telegram}" if telegram && !valid_telegram?(telegram) raise ArgumentError, "Некорректный email: #{email}" if email && !valid_email?(email) raise ArgumentError, "Необходимо указать хотя бы один контакт (телефон, Telegram или email)" unless phone || telegram || email @phone = phone @telegram = telegram @email = email end def present? @phone || @telegram || @email end def get_single_contact return "Phone: #{@phone}" if @phone return "Telegram: #{@telegram}" if @telegram return "Email: #{@email}" if @email 'No contact available' 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 self.new_from_info(info_string) info_string = info_string.sub(/^Contact: /, '').strip case info_string when /\APhone: (.+)\z/i new(phone: Regexp.last_match(1).strip) when /\ATelegram: (.+)\z/i new(telegram: Regexp.last_match(1).strip) when /\AEmail: (.+)\z/i new(email: Regexp.last_match(1).strip) else raise ArgumentError, "Некорректный формат строки контакта: #{info_string}" end end end