| 79 | } |
| 80 | |
| 81 | bool DebugVisualizers::ReadFileTOML(const StringImpl& fileName) |
| 82 | { |
| 83 | std::ifstream ifs(fileName); |
| 84 | toml::ParseResult pr = toml::parse(ifs); |
| 85 | |
| 86 | if (!pr.valid()) |
| 87 | { |
| 88 | Fail(pr.errorReason); |
| 89 | return false; |
| 90 | } |
| 91 | |
| 92 | const toml::Table& root = pr.value.as<toml::Table>(); |
| 93 | for (auto& kv : root) |
| 94 | { |
| 95 | auto& topName = kv.first; |
| 96 | auto& topValue = kv.second; |
| 97 | |
| 98 | if (topName == "Type") |
| 99 | { |
| 100 | for (auto typeValue : ExpectArray(topValue)) |
| 101 | { |
| 102 | auto& value = kv.second; |
| 103 | |
| 104 | DebugVisualizerEntry* entry = mDebugVisualizers.Alloc(); |
| 105 | |
| 106 | for (auto& kv : ExpectTable(typeValue)) |
| 107 | { |
| 108 | auto& name = kv.first; |
| 109 | auto& value = kv.second; |
| 110 | |
| 111 | if (name == "Name") |
| 112 | { |
| 113 | entry->mName = ExpectString(value); |
| 114 | } |
| 115 | else if (name == "Flavor") |
| 116 | { |
| 117 | String flavorName = ExpectString(value); |
| 118 | if (flavorName == "GNU") |
| 119 | entry->mFlavor = DbgFlavor_GNU; |
| 120 | else if (flavorName == "MS") |
| 121 | entry->mFlavor = DbgFlavor_MS; |
| 122 | else |
| 123 | Fail("Unexpected flavor", value); |
| 124 | } |
| 125 | else if ((name == "DisplayString") | (name == "StringView")) |
| 126 | { |
| 127 | bool isStringView = name == "StringView"; |
| 128 | |
| 129 | if (value.is<toml::Array>()) |
| 130 | { |
| 131 | for (auto& displayValue : ExpectArray(value)) |
| 132 | { |
| 133 | DebugVisualizerEntry::DisplayStringEntry* displayStringEntry = new DebugVisualizerEntry::DisplayStringEntry(); |
| 134 | |
| 135 | for (auto& kv : ExpectTable(displayValue)) |
| 136 | { |
| 137 | auto& name = kv.first; |
| 138 | auto& value = kv.second; |