# Написать слабосвязанную программу для работы с юзерами:
# Интерфейс UserRetriever говорит о том что он может вытягивать откуда-то информацию о юзерах
# Наши данные храняться в файле, поэтому UserRetrieverImpl должен уметь работать с файлом
# 1. UserRetrieverImpl должен уметь построчно считывать файл hometask.txt, пропуская строки, которые начинаются с символа #
# Интерфейс UserConverter - это интерфейс который умеет превращать строку в реальную модель.
# 2. Соответственно наш UserConverterImpl будет конвертировать csv формат в User.
# 3. UserValidatorImpl умеет проверять на валидность данные User на основании регулярных выражений. И в случае ошибки возвращать enum ErrorType конкретной ошибки или null если всё ок.
# 4. ErrorType будет содержать поле с текстом ошибки понятной для пользователя.
# 5. UserServiceImpl просто делегирует вызов функций на UserRetriever и UserValidator, только этот класс будет использоваться в Demo