diff options
author | crupest <crupest@outlook.com> | 2022-01-08 19:24:44 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-01-08 19:24:44 +0800 |
commit | 0c7153db084060034092c1dc24222cae384722ec (patch) | |
tree | 9de1bc4636732e3cc1e1fb7309fdf2ff60683f69 /src/toml | |
parent | c38f1f7c273e85c0a6d197cb27424c9ca69e234d (diff) | |
download | cru-0c7153db084060034092c1dc24222cae384722ec.tar.gz cru-0c7153db084060034092c1dc24222cae384722ec.tar.bz2 cru-0c7153db084060034092c1dc24222cae384722ec.zip |
...
Diffstat (limited to 'src/toml')
-rw-r--r-- | src/toml/TomlDocument.cpp | 9 | ||||
-rw-r--r-- | src/toml/TomlParser.cpp | 43 |
2 files changed, 51 insertions, 1 deletions
diff --git a/src/toml/TomlDocument.cpp b/src/toml/TomlDocument.cpp index a785b4e4..052af170 100644 --- a/src/toml/TomlDocument.cpp +++ b/src/toml/TomlDocument.cpp @@ -31,6 +31,15 @@ const TomlSection* TomlDocument::GetSection(const String& name) const { return &it->second; } +TomlSection* TomlDocument::GetSectionOrCreate(const String& name) { + auto it = sections_.find(name); + if (it == sections_.end()) { + sections_[name] = TomlSection(); + return §ions_[name]; + } + return &it->second; +} + void TomlDocument::SetSection(const String& name, TomlSection section) { sections_[name] = std::move(section); } diff --git a/src/toml/TomlParser.cpp b/src/toml/TomlParser.cpp index d54624f6..7f19c711 100644 --- a/src/toml/TomlParser.cpp +++ b/src/toml/TomlParser.cpp @@ -17,6 +17,47 @@ TomlDocument TomlParser::Parse() { } void TomlParser::DoParse(TomlDocument& document) { - // TODO: Implement this. + std::vector<String> lines = input_.SplitToLines(true); + + String current_section_name; + + for (auto& line : lines) { + line.Trim(); + if (line.StartWith(u"[") && line.EndWith(u"]")) { + current_section_name = line.substr(1, line.size() - 2); + } else if (line.StartWith(u"#")) { + // Ignore comments. + } else { + auto equal_index = line.Find(u'='); + + if (equal_index == -1) { + throw TomlParsingException(u"Invalid TOML line: " + line); + } + + auto key = line.substr(0, equal_index).Trim(); + auto value = line.substr(equal_index + 1).Trim(); + + auto remove_quote = [](const String& str) -> String { + if (str.size() < 2) { + return str; + } + + if (str.StartWith(u"\"") && str.EndWith(u"\"")) { + return str.substr(1, str.size() - 2); + } + + if (str.StartWith(u"\'") && str.EndWith(u"\'")) { + return str.substr(1, str.size() - 2); + } + + return str; + }; + + key = remove_quote(key); + value = remove_quote(value); + + document.GetSectionOrCreate(current_section_name)->SetValue(key, value); + } + } } } // namespace cru::toml |