#include #include #include #include #include "ZipExport.h" #include "Pokedex.h" #include "PokemonCard.h" ZipExport::ZipExport() { } ZipExport::~ZipExport() { } ZipExport::ZipExport(Pokedex* pokedex, std::string input_csv, std::string output_zip) { set_pokedex(pokedex); import_csv(input_csv); export_zip(output_zip); } void ZipExport::set_pokedex(Pokedex* pokedex) { this->pokedex = pokedex; } void ZipExport::export_zip(std::string filename) { this->zip_path = filename; std::vector zip_srcs; zip_t* zip = zip_open(this->zip_path.c_str(), ZIP_CREATE | ZIP_EXCL, nullptr); std::string csv_content = "id,value\n"; double total_value = 0.f; for (std::string card_id : this->id_list) { PokemonCard* card = this->pokedex->get_card_by_id(card_id); if (card == nullptr) { csv_content.append(card->id + "," + "???" + "\n"); continue; } card->fetch_market_value(); char* value_str; asprintf(&value_str, "%.2f", card->value); total_value += card->value; csv_content.append(card->id + "," + std::string(value_str) + "\n"); free(value_str); zip_source* image = zip_source_file(zip, card->image_location_hires().c_str(), 0, 0); zip_file_add(zip, std::string(card->id + ".png").c_str(), image, 0); zip_srcs.push_back(image); } zip_source* csv_file = zip_source_buffer(zip, csv_content.data(), csv_content.size(), 0); zip_file_add(zip, "cards.csv", csv_file, 0); zip_close(zip); char* total_value_str; asprintf(&total_value_str, "%.2f", total_value); std::cout << "sum of market value of cards: " << std::string(total_value_str) << std::endl; } void ZipExport::import_csv(std::string filename) { this->csv_path = filename; csv2::Reader, csv2::quote_character<'"'>, csv2::first_row_is_header, csv2::trim_policy::trim_whitespace> csv; if (csv.mmap(this->csv_path)) { for (const auto row: csv) { for (const auto cell: row) { std::string value; cell.read_value(value); this->id_list.push_back(value); } } } else { std::cout << "parsing csv failed!" << std::endl; exit(EXIT_FAILURE); } }