class Student attr_accessor :id, :surname, :name, :patronymic, :git def self.valid_phone_number?(phone) phone.match?(/\A\+?[0-9]{10,15}\z/) end def self.valid_name?(name) name.match?(/\A[А-Яа-яЁёA-Za-z\-]+\z/) end def self.valid_telegram?(telegram) telegram.nil? || telegram.match?(/\A@[A-Za-z0-9_]{5,32}\z/) end def self.valid_email?(email) email.nil? || email.match?(/\A[^@\s]+@[^@\s]+\.[^@\s]+\z/) end def self.valid_git?(git) git.nil? || git.match?(/\Ahttps:\/\/github\.com\/[A-Za-z0-9_\-]+\z/) end def initialize(args = {}) @surname = args.fetch(:surname) raise ArgumentError, "Invalid surname format: #{@surname}" unless Student.valid_name?(@surname) @name = args.fetch(:name) raise ArgumentError, "Invalid name format: #{@name}" unless Student.valid_name?(@name) @patronymic = args.fetch(:patronymic) raise ArgumentError, "Invalid patronymic format: #{@patronymic}" unless Student.valid_name?(@patronymic) @id = args[:id] || nil set_contacts( phone: args[:phone], telegram: args[:telegram], email: args[:email] ) @git = args[:git] raise ArgumentError, "Invalid git format: #{@git}" unless Student.valid_git?(@git) validate end def self.from_string(student_string) parts = student_string.split('|').map(&:strip) surname, name, patronymic = parts[0].split(' ') id = parts[1].split(': ').last.to_i phone = parts[2].split(': ').last telegram = parts[3].split(': ').last email = parts[4].split(': ').last git = parts[5].split(': ').last new( surname: surname, name: name, patronymic: patronymic, id: id, phone: phone, telegram: telegram, email: email, git: git ) end def set_contacts(phone: nil, telegram: nil, email: nil) @phone = phone raise ArgumentError, "Invalid phone number format: #{@phone}" if @phone && !Student.valid_phone_number?(@phone) @telegram = telegram raise ArgumentError, "Invalid telegram format: #{@telegram}" if @telegram && !Student.valid_telegram?(@telegram) @email = email raise ArgumentError, "Invalid email format: #{@email}" if @email && !Student.valid_email?(@email) end def git_present? !@git.nil? && !@git.empty? end def contact_present? !(@phone.nil? || @phone.empty?) || !(@telegram.nil? || @telegram.empty?) || !(@email.nil? || @email.empty?) end def validate raise ArgumentError, "Git link is required" unless git_present? raise ArgumentError, "At least one contact (phone, telegram, or email) is required" unless contact_present? end def to_s "#{@surname} #{@name} #{@patronymic} | ID: #{@id || 'N/A'} | " \ "Phone: #{@phone || 'N/A'} | Telegram: #{@telegram || 'N/A'} | " \ "Email: #{@email || 'N/A'} | Git: #{@git || 'N/A'}" end private attr_reader :phone, :telegram, :email attr_writer :phone, :telegram, :email end