From 43e721305c866ad4b2c4c35d1133f169e41dd49b Mon Sep 17 00:00:00 2001 From: claiff Date: Wed, 5 Oct 2022 15:57:43 +0300 Subject: file reader/writer split by decorators --- src/file/settings/checker_decorator.cpp | 42 +++++++++++++++ src/file/settings/checker_decorator.hpp | 21 ++++++++ src/file/settings/file_decorator.cpp | 77 +++++++++++++++++++++++++++ src/file/settings/file_decorator.hpp | 22 ++++++++ src/file/settings/parser.cpp | 20 +++++++ src/file/settings/parser.hpp | 19 +++++++ src/file/settings/settings.cpp | 31 +++++++++++ src/file/settings/settings.hpp | 25 +++++++++ src/file/settings/types/ifile_manipulator.hpp | 18 +++++++ 9 files changed, 275 insertions(+) create mode 100644 src/file/settings/checker_decorator.cpp create mode 100644 src/file/settings/checker_decorator.hpp create mode 100644 src/file/settings/file_decorator.cpp create mode 100644 src/file/settings/file_decorator.hpp create mode 100644 src/file/settings/parser.cpp create mode 100644 src/file/settings/parser.hpp create mode 100644 src/file/settings/settings.cpp create mode 100644 src/file/settings/settings.hpp create mode 100644 src/file/settings/types/ifile_manipulator.hpp (limited to 'src/file/settings') diff --git a/src/file/settings/checker_decorator.cpp b/src/file/settings/checker_decorator.cpp new file mode 100644 index 0000000..ef560ad --- /dev/null +++ b/src/file/settings/checker_decorator.cpp @@ -0,0 +1,42 @@ +#include "checker_decorator.hpp" + +namespace smtp::file::settings +{ + + // + //Constructors + // + + CheckerDecorator::CheckerDecorator( checker::RegistratorSettings const& registrator_errors ) + : mRegistratorErrors( registrator_errors ) + { + } + + // + //Public methods + // + + manage::SettingsFileDataType CheckerDecorator::Read() const + { + manage::SettingsFileDataType result; + if(!mBase) + { + return result; + } + result = mBase->Read(); + return mRegistratorErrors.Check( result ) ? result : manage::SettingsFileDataType{}; + } + + bool CheckerDecorator::Write( manage::SettingsFileDataType const& settings_fields ) const + { + if( !mBase ) + { + return false; + } + if( mRegistratorErrors.Check( settings_fields ) ) + { + return mBase->Write(settings_fields); + } + return false; + } +} diff --git a/src/file/settings/checker_decorator.hpp b/src/file/settings/checker_decorator.hpp new file mode 100644 index 0000000..ecaba5a --- /dev/null +++ b/src/file/settings/checker_decorator.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "management/general.hpp" +#include "checker/registrator_settings.hpp" +#include "types/ifile_manipulator.hpp" +#include "message/builder/types/idecorator.hpp" + +namespace smtp::file::settings +{ + class CheckerDecorator : public smtp::message::builder::types::IDecorator< types::IFileManipulator> + { + public: + explicit CheckerDecorator( checker::RegistratorSettings const& registrator_errors ); + ~CheckerDecorator() = default; + + manage::SettingsFileDataType Read() const override; + bool Write( manage::SettingsFileDataType const& data ) const override; + private: + checker::RegistratorSettings mRegistratorErrors; + }; +} diff --git a/src/file/settings/file_decorator.cpp b/src/file/settings/file_decorator.cpp new file mode 100644 index 0000000..38b42ce --- /dev/null +++ b/src/file/settings/file_decorator.cpp @@ -0,0 +1,77 @@ +#include + +#include "file_decorator.hpp" +#include "logger/logger_set.hpp" +#include "parser.hpp" +#include "converter/file_to_string.hpp" + +namespace smtp::file::settings +{ + + // + //Constructors + // + + FileDecorator::FileDecorator( std::string const& path_file ) + : mPathFile( path_file ) + { + + } + + // + //Public methods + // + + manage::SettingsFileDataType FileDecorator::Read() const + { + static const std::string METHOD_NAME = "Read settings"; + + std::ifstream settings_file{mPathFile, std::fstream::in}; + if( !settings_file.is_open() ) + { + logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Unable to open file to read " + mPathFile ); + return {}; + } + auto result = GetDataFromFile( settings_file ); + + settings_file.close(); + return result; + } + + bool FileDecorator::Write( manage::SettingsFileDataType const& data ) const + { + static const std::string METHOD_NAME = "Write settings"; + + std::ofstream settings_file{mPathFile, std::fstream::out | std::fstream::trunc}; + if( !settings_file.is_open()) + { + logger::LoggerSet::GetInstance()->LogError( METHOD_NAME, "Unable to open file to write " + mPathFile ); + return false; + } + auto settings_as_list = converter::FileToString{}.Convert(data); + for( const auto& settings_as_string : settings_as_list ) + { + settings_file << settings_as_string << "\n"; + } + settings_file.close(); + return true; + } + + // + //Private methods + // + + manage::SettingsFileDataType FileDecorator::GetDataFromFile( std::ifstream& settings_file ) const + { + std::string line{}; + manage::SettingsFileDataType result; + parser::Settings parser; + + while( std::getline( settings_file, line )) + { + auto parsed_data = parser.Parse( line ); + result.insert( parsed_data ); + } + return result; + } +} diff --git a/src/file/settings/file_decorator.hpp b/src/file/settings/file_decorator.hpp new file mode 100644 index 0000000..5896aed --- /dev/null +++ b/src/file/settings/file_decorator.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include "management/general.hpp" +#include "types/ifile_manipulator.hpp" +#include "message/builder/types/idecorator.hpp" + +namespace smtp::file::settings +{ + class FileDecorator : public smtp::message::builder::types::IDecorator< types::IFileManipulator> + { + public: + explicit FileDecorator( std::string const& path_file ); + ~FileDecorator() = default; + + manage::SettingsFileDataType Read() const override; + bool Write( manage::SettingsFileDataType const& data ) const override; + private: + manage::SettingsFileDataType GetDataFromFile( std::ifstream& settings_file ) const; + + std::string mPathFile; + }; +} diff --git a/src/file/settings/parser.cpp b/src/file/settings/parser.cpp new file mode 100644 index 0000000..b692ac3 --- /dev/null +++ b/src/file/settings/parser.cpp @@ -0,0 +1,20 @@ +#include "parser.hpp" + +namespace smtp::file::parser +{ + ParseResult Settings::Parse( std::string const& line ) const + { + static constexpr char DELIMITER = '='; + static constexpr size_t ZERO_POSITION = 0; + static constexpr size_t NEXT_POSITION = 1; + + auto position = line.find(DELIMITER); + if( position == std::string::npos) + { + return {}; + } + auto first_part = line.substr( ZERO_POSITION, position ); + auto second_part = line.substr(position + NEXT_POSITION, line.length()); + return {first_part, second_part}; + } +} diff --git a/src/file/settings/parser.hpp b/src/file/settings/parser.hpp new file mode 100644 index 0000000..e7de2f6 --- /dev/null +++ b/src/file/settings/parser.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include +#include + +namespace smtp::file::parser +{ + using ParseResult = std::pair; + + class Settings + { + public: + Settings() = default; + ~Settings() = default; + + ParseResult Parse( std::string const& line ) const; + }; + +} diff --git a/src/file/settings/settings.cpp b/src/file/settings/settings.cpp new file mode 100644 index 0000000..48232e6 --- /dev/null +++ b/src/file/settings/settings.cpp @@ -0,0 +1,31 @@ +#include + +#include "settings.hpp" +#include "logger/logger_set.hpp" +#include "converter/file_to_struct.hpp" +#include "converter/struct_to_file.hpp" + +namespace smtp::file::settings +{ + + Settings::Settings( types::IFileManipulatorPtr const& file_manipulator) + : mFileManipulator( file_manipulator ) + { + + } + // + //Public methods + // + + manage::SettingsFields Settings::Read() const + { + auto parsed_store = mFileManipulator->Read(); + return converter::FileToStruct{}.Convert( parsed_store ); + } + + bool Settings::Write( manage::SettingsFields const& settings_fields ) const + { + auto parsed_data = converter::StructToFile{}.Convert( settings_fields ); + return mFileManipulator->Write( parsed_data ); + } +} diff --git a/src/file/settings/settings.hpp b/src/file/settings/settings.hpp new file mode 100644 index 0000000..60634fe --- /dev/null +++ b/src/file/settings/settings.hpp @@ -0,0 +1,25 @@ +#pragma once + +#include "management/general.hpp" +#include "types/ifile_manipulator.hpp" + +namespace smtp::file::settings +{ + class Settings + { + public: + explicit Settings( types::IFileManipulatorPtr const& file_manipulator ); + ~Settings() = default; + + manage::SettingsFields Read() const; + bool Write( manage::SettingsFields const& settings_fields ) const; + private: + manage::SettingsFileDataType GetParsedStore() const; + manage::SettingsFileDataType GetDataFromFile( std::ifstream& settings_file ) const; + bool SetParsedData( manage::SettingsFileDataType const& parsed_data ) const; + std::string BuildParam( std::pair < std::string, std::string > const& data ) const; + + std::string mPathFile; + types::IFileManipulatorPtr mFileManipulator; + }; +} diff --git a/src/file/settings/types/ifile_manipulator.hpp b/src/file/settings/types/ifile_manipulator.hpp new file mode 100644 index 0000000..6de0bf3 --- /dev/null +++ b/src/file/settings/types/ifile_manipulator.hpp @@ -0,0 +1,18 @@ + #pragma once + +#include + +#include "management/general.hpp" + +namespace smtp::file::settings::types +{ + class IFileManipulator + { + public: + virtual ~IFileManipulator() = default; + + virtual manage::SettingsFileDataType Read() const = 0; + virtual bool Write( manage::SettingsFileDataType const& data ) const = 0; + }; + using IFileManipulatorPtr = std::shared_ptr; +} -- cgit v1.2.3