#include #include "settings.hpp" #include "logger/logger_set.hpp" namespace smtp::file { // //Constructors // Settings::Settings( std::string const& path_file, checker::RegistratorSettings const& registrator_errors ) : mPathFile( path_file ) , mRegistratorErrors( registrator_errors ) { } // //Public methods // manage::SettingsFields Settings::Read() const { auto parsed_store = GetParsedStore(); return converter::Full{}.Convert( parsed_store ); } bool Settings::Write( manage::SettingsFields const& settings_fields ) const { auto parsed_data = converter::Full{}.Convert( settings_fields ); return mRegistratorErrors.Check( parsed_data ) && SetParsedData( parsed_data ); } // //Private methods // manage::SettingsFileDataType Settings::GetParsedStore() 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 mRegistratorErrors.Check( result ) ? result : manage::SettingsFileDataType{}; } manage::SettingsFileDataType Settings::GetDataFromFile( std::ifstream& settings_file ) const { std::string line{}; manage::SettingsFileDataType result; while( std::getline( settings_file, line )) { auto parsed_data = parser::Settings{}.Parse( line ); result.insert( parsed_data ); } return result; } bool Settings::SetParsedData( manage::SettingsFileDataType const& parsed_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; } for( const auto& data: parsed_data ) { auto line = BuildParam( data ); settings_file << line << "\n"; } settings_file.close(); return true; } std::string Settings::BuildParam( std::pair < std::string, std::string > const& data ) const { std::string result; result += data.first; result += '='; result += data.second; return result; } }