| 14 | } |
| 15 | |
| 16 | SProject* SProject::OpenProject(const skr::filesystem::path& projectFile) noexcept |
| 17 | { |
| 18 | std::error_code ec = {}; |
| 19 | auto resolvePath = [&](skr::String& path) |
| 20 | { |
| 21 | auto view = path.view(); |
| 22 | auto i = view.index_of(u8"${"); |
| 23 | if(i == ostr::global_constant::INDEX_INVALID) |
| 24 | return path; |
| 25 | skr::String resolved; |
| 26 | resolved.raw().reserve(path.raw().size()); |
| 27 | //resolved.append(view); |
| 28 | while(true) |
| 29 | { |
| 30 | resolved.append(view.subview(0, i - 1)); |
| 31 | auto j = view.index_of(u8"}", i, view.size() - 1); |
| 32 | if (j == ostr::global_constant::INDEX_INVALID) |
| 33 | { |
| 34 | resolved.append(view.subview(i, view.size() - 1)); |
| 35 | break; |
| 36 | } |
| 37 | auto var = view.subview(i + 2, j - 1); |
| 38 | if (var == u8"workspace") |
| 39 | { |
| 40 | resolved.append(Workspace.u8string().c_str()); |
| 41 | } |
| 42 | else if(var == u8"platform") |
| 43 | { |
| 44 | resolved.append(SKR_RESOURCE_PLATFORM); |
| 45 | } |
| 46 | view = view.subview(j + 1, view.size() - 1); |
| 47 | i = view.index_of(u8"${"); |
| 48 | if (i == ostr::global_constant::INDEX_INVALID) |
| 49 | { |
| 50 | resolved.append(view); |
| 51 | break; |
| 52 | } |
| 53 | } |
| 54 | return resolved; |
| 55 | }; |
| 56 | auto toAbsolutePath = [&](skr::String& path) |
| 57 | { |
| 58 | auto resolved = resolvePath(path); |
| 59 | skr::filesystem::path result{resolved.c_str()}; |
| 60 | if (result.is_relative()) |
| 61 | { |
| 62 | result = projectFile.parent_path() / result; |
| 63 | } |
| 64 | return result.lexically_normal(); |
| 65 | }; |
| 66 | |
| 67 | auto projectPath = projectFile.lexically_normal().string(); |
| 68 | auto jsonstring = simdjson::padded_string::load(projectPath); |
| 69 | simdjson::ondemand::parser parser; |
| 70 | auto doc = parser.iterate(jsonstring); |
| 71 | if(doc.error()) |
| 72 | { |
| 73 | SKR_LOG_ERROR(u8"Failed to parse project file: %s, error: %s", projectPath.c_str(), simdjson::error_message(doc.error())); |
nothing calls this directly
no test coverage detected