Skip to content
Snippets Groups Projects
Commit 9e9908be authored by Joaquim Casals Buñuel's avatar Joaquim Casals Buñuel
Browse files

Better error reporting for the YAML parser

parent 46c28342
No related branches found
No related tags found
1 merge request!313WIP: Resolve "Processor constructors and creators requiring a sensor pointer?"
Pipeline #4222 passed
...@@ -186,6 +186,7 @@ class ParserYAML { ...@@ -186,6 +186,7 @@ class ParserYAML {
std::vector<std::array<std::string, 3>> _callbacks; std::vector<std::array<std::string, 3>> _callbacks;
YAML::Node problem; YAML::Node problem;
std::string generatePath(std::string); std::string generatePath(std::string);
YAML::Node loadYAML(std::string);
public: public:
ParserYAML(){ ParserYAML(){
_params = std::map<std::string, std::string>(); _params = std::map<std::string, std::string>();
...@@ -252,6 +253,13 @@ std::string ParserYAML::generatePath(std::string path){ ...@@ -252,6 +253,13 @@ std::string ParserYAML::generatePath(std::string path){
return _path_root + path; return _path_root + path;
} }
} }
YAML::Node ParserYAML::loadYAML(std::string file){
try{
return YAML::LoadFile(generatePath(file));
}catch (YAML::BadFile& e){
throw std::runtime_error("Couldn't load file " + generatePath(file));
}
}
std::string ParserYAML::tagsToString(std::vector<std::string> &tags){ std::string ParserYAML::tagsToString(std::vector<std::string> &tags){
std::string hdr = ""; std::string hdr = "";
for(auto it : tags){ for(auto it : tags){
...@@ -262,20 +270,20 @@ std::string ParserYAML::tagsToString(std::vector<std::string> &tags){ ...@@ -262,20 +270,20 @@ std::string ParserYAML::tagsToString(std::vector<std::string> &tags){
void ParserYAML::walkTree(std::string file){ void ParserYAML::walkTree(std::string file){
YAML::Node n; YAML::Node n;
std::cout << "Parsing " << generatePath(file) << std::endl; std::cout << "Parsing " << generatePath(file) << std::endl;
n = YAML::LoadFile(generatePath(file)); n = loadYAML(generatePath(file));
std::vector<std::string> hdrs = std::vector<std::string>(); std::vector<std::string> hdrs = std::vector<std::string>();
walkTreeR(n, hdrs, ""); walkTreeR(n, hdrs, "");
} }
void ParserYAML::walkTree(std::string file, std::vector<std::string>& tags){ void ParserYAML::walkTree(std::string file, std::vector<std::string>& tags){
YAML::Node n; YAML::Node n;
std::cout << "Parsing " << generatePath(file) << std::endl; std::cout << "Parsing " << generatePath(file) << std::endl;
n = YAML::LoadFile(generatePath(file)); n = loadYAML(generatePath(file));
walkTreeR(n, tags, ""); walkTreeR(n, tags, "");
} }
void ParserYAML::walkTree(std::string file, std::vector<std::string>& tags, std::string hdr){ void ParserYAML::walkTree(std::string file, std::vector<std::string>& tags, std::string hdr){
YAML::Node n; YAML::Node n;
std::cout << "Parsing " << generatePath(file) << std::endl; std::cout << "Parsing " << generatePath(file) << std::endl;
n = YAML::LoadFile(generatePath(file)); n = loadYAML(generatePath(file));
walkTreeR(n, tags, hdr); walkTreeR(n, tags, hdr);
} }
/** @Brief Recursively walks the YAML tree while filling a map with the values parsed from the file /** @Brief Recursively walks the YAML tree while filling a map with the values parsed from the file
...@@ -365,18 +373,28 @@ void ParserYAML::updateActiveName(std::string tag){ ...@@ -365,18 +373,28 @@ void ParserYAML::updateActiveName(std::string tag){
void ParserYAML::parseFirstLevel(std::string file){ void ParserYAML::parseFirstLevel(std::string file){
YAML::Node n; YAML::Node n;
std::cout << "Parsing " << generatePath(file) << std::endl; std::cout << "Parsing " << generatePath(file) << std::endl;
n = YAML::LoadFile(generatePath(file)); n = loadYAML(generatePath(file));
YAML::Node n_config = n["config"]; YAML::Node n_config = n["config"];
assert(n_config.Type() == YAML::NodeType::Map && "trying to parse config node but found a non-Map node"); // assert(n_config.Type() == YAML::NodeType::Map && "trying to parse config node but found a non-Map node");
if(n_config.Type() != YAML::NodeType::Map) throw std::runtime_error("Could not find config node. Please make sure that your YAML file " + generatePath(file) + " starts with 'config:'");
if(n_config["problem"].Type() != YAML::NodeType::Map) throw std::runtime_error("Could not find problem node. Please make sure that the 'config' node in YAML file " + generatePath(file) + " has a 'problem' entry");
this->problem = n_config["problem"]; this->problem = n_config["problem"];
for(const auto& kv : n_config["sensors"]){ try{
for(const auto& kv : n_config["sensors"]){
ParamsInitSensor pSensor = {kv["type"].Scalar(), kv["name"].Scalar(), kv}; ParamsInitSensor pSensor = {kv["type"].Scalar(), kv["name"].Scalar(), kv};
_paramsSens.push_back(pSensor); _paramsSens.push_back(pSensor);
}
} catch(YAML::InvalidNode& e){
throw std::runtime_error("Error parsing sensors. Please make sure that each sensor entry has 'type' and 'name' entries.");
} }
for(const auto& kv : n_config["processors"]){ try{
for(const auto& kv : n_config["processors"]){
ParamsInitProcessor pProc = {kv["type"].Scalar(), kv["name"].Scalar(), kv["sensor_name"].Scalar(), kv}; ParamsInitProcessor pProc = {kv["type"].Scalar(), kv["name"].Scalar(), kv["sensor_name"].Scalar(), kv};
_paramsProc.push_back(pProc); _paramsProc.push_back(pProc);
}
} catch(YAML::InvalidNode& e){
throw std::runtime_error("Error parsing processors. Please make sure that each processor has 'type', 'name' and 'sensor_name' entries.");
} }
for(const auto& kv : n_config["callbacks"]){ for(const auto& kv : n_config["callbacks"]){
_callbacks.push_back({{kv[0].as<std::string>(), kv[1].as<std::string>(), kv[2].as<std::string>()}}); _callbacks.push_back({{kv[0].as<std::string>(), kv[1].as<std::string>(), kv[2].as<std::string>()}});
......
config: config:
# problem: problem:
# frame_structure: "POV" frame_structure: "POV"
# dimension: 2 dimension: 2
sensors: sensors:
- -
type: "ODOM 2D" type: "ODOM 2D"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment