writer.py 2.2 KB

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