SectionPairFileReader.cpp 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. /*
  2. * Author: Patrick-Christopher Mattulat
  3. * Co-Author: Claude Sonnet 4.6 (LLM)
  4. * Company: Lynar Studios
  5. * E-Mail: webmaster@lynarstudios.com
  6. * Created: 2023-02-21
  7. * Changed: 2026-06-24
  8. *
  9. * */
  10. #include <ls-std/core/ConditionalFunctionExecutor.hpp>
  11. #include <ls-std/core/exception/IllegalArgumentException.hpp>
  12. #include <ls-std/io/FileReader.hpp>
  13. #include <ls-std/io/NewLine.hpp>
  14. #include <ls-std/io/evaluator/FileExistenceEvaluator.hpp>
  15. #include <ls-std/io/section-pair/model/SectionPairDocument.hpp>
  16. #include <ls-std/io/section-pair/reader/SectionPairFileReader.hpp>
  17. #include <ls-std/io/section-pair/validator/SectionPairFileExtensionValidator.hpp>
  18. #include <memory>
  19. using ls::standard::core::Class;
  20. using ls::standard::core::ConditionalFunctionExecutor;
  21. using ls::standard::core::IllegalArgumentException;
  22. using ls::standard::core::type::byte_field;
  23. using ls::standard::io::File;
  24. using ls::standard::io::FileExistenceEvaluator;
  25. using ls::standard::io::FileReader;
  26. using ls::standard::io::NewLine;
  27. using ls::standard::io::SectionPairDocument;
  28. using ls::standard::io::SectionPairFileExtensionValidator;
  29. using ls::standard::io::SectionPairFileReader;
  30. using ls::standard::io::SectionPairFileReaderParameter;
  31. using std::make_shared;
  32. using std::shared_ptr;
  33. using std::string;
  34. SectionPairFileReader::SectionPairFileReader(const SectionPairFileReaderParameter &_parameter) : Class("SectionPairFileReader"), parameter(_parameter)
  35. {
  36. ConditionalFunctionExecutor{this->parameter.getFileExistenceEvaluator() == nullptr}.execute([this] { _createFileExistenceEvaluator(); });
  37. this->parameter.getFileExistenceEvaluator()->evaluate();
  38. this->_checkFileExtension();
  39. ConditionalFunctionExecutor{this->parameter.getReader() == nullptr}.execute([this] { _createReader(); });
  40. ConditionalFunctionExecutor{this->parameter.getDocument() == nullptr}.execute([this] { _createDocument(); });
  41. }
  42. SectionPairFileReader::~SectionPairFileReader() noexcept = default;
  43. shared_ptr<SectionPairDocument> SectionPairFileReader::getDocument() const
  44. {
  45. return this->parameter.getDocument();
  46. }
  47. byte_field SectionPairFileReader::read()
  48. {
  49. this->parameter.getDocument()->clear();
  50. byte_field data = this->parameter.getReader()->read();
  51. this->parameter.getDocument()->reserveNewLine(SectionPairFileReader::_detectNewLine(data));
  52. this->parameter.getDocument()->unmarshal(data);
  53. return data;
  54. }
  55. void SectionPairFileReader::_checkFileExtension() const
  56. {
  57. if (!SectionPairFileExtensionValidator{this->parameter.getFilePath()}.isValid())
  58. {
  59. const string message = "\"" + this->parameter.getFilePath() + "\" does not have a valid section pair file extension (.txt or .sp)!";
  60. throw IllegalArgumentException{message};
  61. }
  62. }
  63. void SectionPairFileReader::_createDocument()
  64. {
  65. this->parameter.setDocument(make_shared<SectionPairDocument>());
  66. }
  67. void SectionPairFileReader::_createFileExistenceEvaluator()
  68. {
  69. this->parameter.setFileExistenceEvaluator(make_shared<FileExistenceEvaluator>(this->parameter.getFilePath()));
  70. }
  71. void SectionPairFileReader::_createReader()
  72. {
  73. File file{this->parameter.getFilePath()};
  74. this->parameter.setReader(make_shared<FileReader>(file));
  75. }
  76. string SectionPairFileReader::_detectNewLine(const byte_field &_data)
  77. {
  78. return _data.find(NewLine::getWindowsNewLine()) != string::npos ? NewLine::getWindowsNewLine() : NewLine::getUnixNewLine();
  79. }