#include "command.h" #include #include "config.h" #include "sbo.h" #include #include #include "component.h" namespace katja { void list::execute() const { sbo sbo_repository; std::unordered_map packages = katja::read_package_database(); std::vector> table_data; std::set installed_packages; std::unordered_map package_database = read_package_database(); for (const auto& package : package_database) { std::string tag = package.second.tag(); if (tag.find("_SBo") == std::string::npos) { continue; } installed_packages.insert(package.first); } for (const auto& package : sbo_repository.list(installed_packages)) { if (package_database.find(package.first)->second.version() == package.second.version()) { continue; } table_data.push_back({ package.second.name(), package.second.version(), package.second.tag(), package.second.architecture(), "SBo" }); } auto screen = ftxui::ScreenInteractive::Fullscreen(); PackageList list_component{ { "Package name", "Version", "Tag", "Architecture", "Repository" }, table_data }; screen.Loop(std::make_shared(list_component)); } void help::execute() const { std::cout << "Usage:\n" "\tkatja {list|update|help} [OPTIONS]\n\n"; } void update::execute() const { sbo().refresh(); } command_exception::command_exception(const command_exception_t exception_type, std::vector failed_arguments) noexcept : m_exception_type(exception_type), m_failed_arguments(failed_arguments) { } const char *command_exception::what() const noexcept { switch (m_exception_type) { case command_exception_t::no_command: return "No command specified."; case command_exception_t::too_many_arguments: return "Too many arguments given."; case command_exception_t::unknown_command: return "Unknown command."; } assert(false); } const std::vector& command_exception::failed_arguments() const noexcept { return m_failed_arguments; } std::unique_ptr parse_command_line(int argc, char **argv) { if (argc > 2) { std::vector failed_arguments; for (std::size_t i = 2; i < argc; ++i) { failed_arguments.push_back(argv[i]); } throw command_exception(command_exception_t::unknown_command); } else if (argc < 2) { throw command_exception(command_exception_t::no_command); } if (strcmp(argv[1], "list") == 0) { return std::make_unique(); } else if (strcmp(argv[1], "update") == 0) { return std::make_unique(); } else if (strcmp(argv[1], "help") == 0) { return std::make_unique(); } throw command_exception(command_exception_t::unknown_command, { argv[1] }); } }