class Contact attr_reader :phone, :telegram, :email def initialize(phone: nil, telegram: nil, email: nil) @phone = phone @telegram = telegram @email = email validate_contacts end def valid_phone_number? return true if @phone.nil? # Разрешить от 9 до 15 цифр /\A\+?[0-9]{9,15}\z/.match?(@phone) end def valid_telegram? return true if @telegram.nil? /\A@[A-Za-z0-9_]{5,32}\z/.match?(@telegram) end def valid_email? return true if @email.nil? /\A[^@\s]+@[^@\s]+\.[^@\s]+\z/.match?(@email) end def present? @phone || @telegram || @email end def info return "Phone: #{@phone}" if @phone return "Telegram: #{@telegram}" if @telegram return "Email: #{@email}" if @email 'No contact available' end private def validate_contacts if !present? raise ArgumentError, 'At least one contact (phone, telegram, or email) is required' end raise ArgumentError, "Invalid phone number format: #{@phone}" if @phone && !valid_phone_number? raise ArgumentError, "Invalid telegram format: #{@telegram}" if @telegram && !valid_telegram? raise ArgumentError, "Invalid email format: #{@email}" if @email && !valid_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, "Invalid contact info format: #{info_string}" end end end