From 5550b9563b9bf8113522231648234818cfc1e4f5 Mon Sep 17 00:00:00 2001 From: Artem Darius Weber Date: Sat, 14 Dec 2024 13:15:06 +0300 Subject: [PATCH] feat: add Contact class with validation for phone, telegram, and email --- lab2/contact.rb | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 lab2/contact.rb diff --git a/lab2/contact.rb b/lab2/contact.rb new file mode 100644 index 0000000..05d8df6 --- /dev/null +++ b/lab2/contact.rb @@ -0,0 +1,52 @@ +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? + + /\A\+?[0-9]{10,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 +end