diff --git a/src/core/loader/loader.cpp b/src/core/loader/loader.cpp index 59ca7091a..b8f8f1448 100644 --- a/src/core/loader/loader.cpp +++ b/src/core/loader/loader.cpp @@ -3,8 +3,10 @@ // Refer to the license.txt file included. #include +#include #include #include +#include "common/concepts.h" #include "common/file_util.h" #include "common/logging/log.h" #include "common/string_util.h" @@ -21,27 +23,41 @@ namespace Loader { +namespace { + +template T> +std::optional IdentifyFileLoader(FileSys::VirtualFile file) { + const auto file_type = T::IdentifyType(file); + if (file_type != FileType::Error) { + return file_type; + } + return std::nullopt; +} + +} // namespace + FileType IdentifyFile(FileSys::VirtualFile file) { - FileType type; - -#define CHECK_TYPE(loader) \ - type = AppLoader_##loader::IdentifyType(file); \ - if (FileType::Error != type) \ - return type; - - CHECK_TYPE(DeconstructedRomDirectory) - CHECK_TYPE(ELF) - CHECK_TYPE(NSO) - CHECK_TYPE(NRO) - CHECK_TYPE(NCA) - CHECK_TYPE(XCI) - CHECK_TYPE(NAX) - CHECK_TYPE(NSP) - CHECK_TYPE(KIP) - -#undef CHECK_TYPE - - return FileType::Unknown; + if (const auto romdir_type = IdentifyFileLoader(file)) { + return *romdir_type; + } else if (const auto elf_type = IdentifyFileLoader(file)) { + return *elf_type; + } else if (const auto nso_type = IdentifyFileLoader(file)) { + return *nso_type; + } else if (const auto nro_type = IdentifyFileLoader(file)) { + return *nro_type; + } else if (const auto nca_type = IdentifyFileLoader(file)) { + return *nca_type; + } else if (const auto xci_type = IdentifyFileLoader(file)) { + return *xci_type; + } else if (const auto nax_type = IdentifyFileLoader(file)) { + return *nax_type; + } else if (const auto nsp_type = IdentifyFileLoader(file)) { + return *nsp_type; + } else if (const auto kip_type = IdentifyFileLoader(file)) { + return *kip_type; + } else { + return FileType::Unknown; + } } FileType GuessFromFilename(const std::string& name) {