require_relative 'person' class StudentShort < Person attr_reader :surname_initials def initialize(id:, surname_initials:, phone: nil, telegram: nil, email: nil) super(id: id, phone: phone, telegram: telegram, email: email) @surname_initials = surname_initials end def self.from_student(student) new( id: student.id, surname_initials: student.surname_and_initials, phone: student.phone, telegram: student.telegram, email: student.email ) end def self.from_string(id, info_string) parts = info_string.split(',').map(&:strip) raise ArgumentError, 'Invalid info string format' if parts.size < 2 surname_initials = parts[0] contact_string = parts[1].split(': ', 2).last.strip phone, telegram, email = parse_contact_string(contact_string) new( id: id, surname_initials: surname_initials, phone: phone, telegram: telegram, email: email ) end def to_s contact_info = contact_info() "#{@surname_initials}, Contact: #{contact_info}" end private def self.parse_contact_string(contact_string) case contact_string when /\APhone: (.+)\z/i [Regexp.last_match(1).strip, nil, nil] when /\ATelegram: (.+)\z/i [nil, Regexp.last_match(1).strip, nil] when /\AEmail: (.+)\z/i [nil, nil, Regexp.last_match(1).strip] else raise ArgumentError, "Invalid contact string format: #{contact_string}" end end end