| 24 | |
| 25 | } |
| 26 | |
| 27 | std::vector<NamedAsset> discover_named_assets( |
| 28 | const std::filesystem::path & root, |
| 29 | const std::vector<std::string> & relative_candidates) { |
| 30 | std::unordered_map<std::string, int> stem_counts; |
| 31 | for (const auto & candidate : relative_candidates) { |
| 32 | ++stem_counts[candidate_stem_or_filename(candidate)]; |
| 33 | } |
| 34 | |
| 35 | std::vector<NamedAsset> assets; |
| 36 | assets.reserve(relative_candidates.size()); |
| 37 | for (const auto & candidate : relative_candidates) { |
| 38 | const auto path = root / candidate; |
| 39 | if (engine::io::is_existing_file(path)) { |
| 40 | const auto base_id = candidate_stem_or_filename(candidate); |
| 41 | const auto id = stem_counts[base_id] == 1 ? base_id : normalized_candidate_key(candidate); |
| 42 | assets.push_back({id, std::filesystem::weakly_canonical(path)}); |
| 43 | } |
| 44 | } |
| 45 | return assets; |
| 46 | } |
| 47 | |
| 48 | std::vector<NamedAsset> discover_named_assets_from_package_spec( |
no test coverage detected