Trouble in getting to content within brackets

347 views Asked by At

monsters.yaml

- name: Ogre
      position: [0, 5, 0]
      powers:
        - name: Club
          damage: 10
        - name: Fist
          damage: 8
    - name: Dragon
      position: [1, 0, 10]
      powers:
        - name: Fire Breath
          damage: 25
        - name: Claws
          damage: 15
    - name: Wizard
      position: [5, -3, 0]
      powers:
        - name: Acid Rain
          damage: 50
        - name: Staff
          damage: 3

main.cpp

#include "yaml-cpp/yaml.h"
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

// our data types
struct Vec3 {
   float x, y, z;
};

struct Power {
   std::string name;
   int damage;
};

struct Monster {
   std::string name;
   Vec3 position;
   std::vector <Power> powers;
};

// now the extraction operators for these types
void operator >> (const YAML::Node& node, Vec3& v) {
   node[0] >> v.x;
   node[1] >> v.y;
   node[2] >> v.z;
}

void operator >> (const YAML::Node& node, Power& power) {
   node["name"] >> power.name;
   node["damage"] >> power.damage;
}

void operator >> (const YAML::Node& node, Monster& monster) {
   node["name"] >> monster.name;
   node["position"] >> monster.position;
   const YAML::Node& powers = node["powers"];
   for(unsigned i=0;i<powers.size();i++) {
      Power power;
      powers[i] >> power;
      monster.powers.push_back(power);
   }
}

int main()
{
   std::ifstream fin("monsters.yaml");
   YAML::Parser parser(fin);
   YAML::Node doc;
   parser.GetNextDocument(doc);
   for(unsigned i=0;i<doc.size();i++) {
      Vec3 v;
      doc[i] >> v;
      std::cout << v.x << "\n";
      std::cout << v.y << "\n";
      std::cout << v.z << "\n";
   }

   return 0;
}

I thought that, if I modify code analogously, the content of Vec3 will be couted, but it doesn't. What am I doing wrong?

1

There are 1 answers

0
Jesse Beder On BEST ANSWER

Your YAML document is a sequence of "monsters", not "vectors". To get to the "position" attribute, you need:

doc[i]["position"] >> v;

Also, your YAML has indentation errors (the top-level sequence isn't lined up). I'm assuming it's correct in your file; just be careful when copying it here.