writer.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import sys
  2. import traceback
  3. from pathlib import Path
  4. from job_search.read_write import ReadWriter
  5. from job_search.job_storage import JobStorage
  6. from job_search.messages import (
  7. VisitedLinkedInJobPageMessage,
  8. InitialConfigurationMessage,
  9. JobOfferListMessage,
  10. LogMessage,
  11. Message,
  12. JobAddedMessage,
  13. JobAlreadyExistsMessage,
  14. )
  15. class Application:
  16. def __init__(self, stdin, stdout):
  17. self.read_writer = ReadWriter(stdin, stdout)
  18. self.job_storage = None
  19. def handle_message(self, message: Message):
  20. match message:
  21. case VisitedLinkedInJobPageMessage():
  22. offer = message.extract_job_offer()
  23. try:
  24. self.job_storage.add_job(offer)
  25. self.read_writer.send_message(JobAddedMessage(offer))
  26. except FileExistsError as e:
  27. self.read_writer.send_message(JobAlreadyExistsMessage(offer.id))
  28. case InitialConfigurationMessage(jobs_path):
  29. self.job_storage = JobStorage(base_dir=Path(jobs_path))
  30. def loop(self):
  31. while True:
  32. try:
  33. received_message = self.read_writer.get_message()
  34. self.handle_message(received_message)
  35. if self.job_storage:
  36. self.read_writer.send_message(
  37. JobOfferListMessage(self.job_storage.read_all())
  38. )
  39. except Exception as e:
  40. exc_info = sys.exc_info()
  41. tb = "".join(traceback.format_exception(*exc_info))
  42. self.read_writer.send_message(LogMessage.error(content=tb))
  43. if __name__ == "__main__":
  44. app = Application(sys.stdin, sys.stdout)
  45. app.loop()