require_relative 'person' class Student < Person attr_accessor :surname, :name, :patronymic def initialize(args = {}) super(args) @surname = args.fetch(:surname) raise ArgumentError, "Invalid surname format: #{@surname}" unless self.class.valid_name?(@surname) @name = args.fetch(:name) raise ArgumentError, "Invalid name format: #{@name}" unless self.class.valid_name?(@name) @patronymic = args.fetch(:patronymic) raise ArgumentError, "Invalid patronymic format: #{@patronymic}" unless self.class.valid_name?(@patronymic) set_contacts( phone: args[:phone], telegram: args[:telegram], email: args[:email] ) 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 self.read_from_txt(file_path) raise IOError, "File path is invalid or file does not exist: #{file_path}" unless File.exist?(file_path) students = [] File.foreach(file_path) do |line| line.strip! next if line.empty? begin student = from_string(line) students << student rescue ArgumentError => e puts "Error processing line: '#{line}'. Reason: #{e.message}" end end students end def self.write_to_txt(file_path, students) raise ArgumentError, "Expected an array of Student objects" unless students.is_a?(Array) && students.all? { |s| s.is_a?(Student) } File.open(file_path, 'w') do |file| students.each do |student| file.puts student.to_s end end puts "Data successfully written to #{file_path}" rescue IOError => e puts "An error occurred while writing to the file: #{e.message}" end def surname_and_initials "#{@surname} #{name[0]}.#{patronymic[0]}." 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 def get_info "#{surname_and_initials}, Git: #{git_info}, Contact: #{contact_info}" end end