aboutsummaryrefslogtreecommitdiff
path: root/src/toml/TomlParser.cpp
blob: 1aea5b73ab0914c6149ebca9c21bc583ae56619e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include "cru/toml/TomlParser.h"
#include "cru/base/StringUtil.h"
#include "cru/toml/TomlDocument.h"

namespace cru::toml {
TomlParser::TomlParser(std::string input) : input_(std::move(input)) {}

TomlParser::~TomlParser() = default;

TomlDocument TomlParser::Parse() {
  if (cache_) {
    return *cache_;
  }

  cache_ = TomlDocument();
  DoParse(*cache_);
  return *cache_;
}

void TomlParser::DoParse(TomlDocument& document) {
  std::vector<std::string> lines = cru::string::Split(input_, "\n", cru::string::SplitOptions::RemoveSpace);

  std::string current_section_name;

  for (auto& line : lines) {
    line = cru::string::Trim(line);
    if (line.starts_with("[") && line.ends_with("]")) {
      current_section_name = line.substr(1, line.size() - 2);
    } else if (line.starts_with("#")) {
      // Ignore comments.
    } else {
      auto equal_index = line.find('=');

      if (equal_index == std::string::npos) {
        throw TomlParsingException("Invalid TOML line: " + line);
      }

      auto key = cru::string::Trim(line.substr(0, equal_index));
      auto value = cru::string::Trim(line.substr(equal_index + 1));

      document.GetSectionOrCreate(current_section_name)->SetValue(key, value);
    }
  }
}
}  // namespace cru::toml