Files
aman-es/src/config/CommunicationFileFormat.cpp

104 lines
2.9 KiB
C++

/*
* Author:
* Sven Czarnian <devel@svcz.de>
* Brief:
* Implements the communication file format
* Copyright:
* 2021 Sven Czarnian
* License:
* GNU General Public License v3 (GPLv3)
*/
#include <fstream>
#include <gsl/gsl>
#include <aman/config/CommunicationFileFormat.h>
#include <aman/helper/String.h>
using namespace aman;
CommunicationFileFormat::CommunicationFileFormat() :
FileFormat() { }
bool CommunicationFileFormat::parse(const std::string& filename, Communication& config) {
config.valid = true;
std::ifstream stream(filename);
if (false == stream.is_open()) {
this->m_errorMessage = "Unable to open the configuration file: " + filename;
this->m_errorLine = 0;
config.valid = false;
return false;
}
std::string line;
std::uint32_t lineOffset = 0;
while (std::getline(stream, line)) {
std::string value;
lineOffset += 1;
/* skip a new line */
if (0 == line.length())
continue;
/* trimm the line and check if a comment line is used */
std::string trimmed = String::trim(line);
if (0 == trimmed.find_first_of('#', 0))
continue;
auto entry = String::splitString(trimmed, "=");
if (2 > entry.size()) {
this->m_errorLine = lineOffset;
this->m_errorMessage = "Invalid configuration entry";
config.valid = false;
return false;
}
else if (2 < entry.size()) {
for (std::size_t idx = 1; idx < entry.size() - 1; ++idx)
value += gsl::at(entry, idx) + "=";
value += entry.back();
}
else {
value = gsl::at(entry, 1);
}
/* found an invalid line */
if (0 == value.length()) {
this->m_errorLine = lineOffset;
this->m_errorMessage = "Invalid entry";
config.valid = false;
return false;
}
if ("Address" == gsl::at(entry, 0)) {
config.address = gsl::at(entry, 1);
}
else if ("HttpsProtocol" == gsl::at(entry, 0)) {
config.httpsProtocol = "0" != gsl::at(entry, 1);
}
else if ("PortBackend" == gsl::at(entry, 0)) {
config.portBackend = static_cast<std::uint16_t>(std::atoi(gsl::at(entry, 1).c_str()));
}
else if ("PortRestAPI" == gsl::at(entry, 0)) {
config.portRestAPI = static_cast<std::uint16_t>(std::atoi(gsl::at(entry, 1).c_str()));
}
else {
this->m_errorLine = lineOffset;
this->m_errorMessage = "Unknown entry: " + gsl::at(entry, 0);
config.valid = false;
return false;
}
}
if (0 == lineOffset) {
this->m_errorLine = 0;
this->m_errorMessage = "No data found in " + filename;
config.valid = false;
return false;
}
return true;
}