#pragma once #include #include #include #include #include #include #include #include #if (__cpp_lib_chrono < 201907L) # include #endif namespace scwx::provider { template requires std::same_as, std::chrono::sys_days> && std::same_as, std::string_view> && std::same_as, std::string_view> boost::outcome_v2::result> IemApiProvider::ListTextProducts(DateRange dates, CcccRange ccccs, PilRange pils) { using namespace std::chrono; #if (__cpp_lib_chrono >= 201907L) namespace df = std; static constexpr std::string_view kDateFormat {"{:%Y-%m-%d}"}; #else using namespace date; namespace df = date; # define kDateFormat "%Y-%m-%d" #endif auto formattedDates = dates | ranges::views::transform( [](const std::chrono::sys_days& date) { return df::format(kDateFormat, date); }); logger_->debug("Listing text products for: {}", boost::algorithm::join(formattedDates, ", ")); std::vector asyncResponses {}; for (const auto& [date, cccc, pil] : ranges::views::cartesian_product(dates, ccccs, pils)) { auto parameters = cpr::Parameters {{"date", df::format(kDateFormat, date)}}; // WMO Source Code if (!cccc.empty()) { parameters.Add({"cccc", std::string {cccc}}); } // AFOS / AWIPS ID / 3-6 length identifier if (!pil.empty()) { parameters.Add({"pil", std::string {pil}}); } asyncResponses.emplace_back( cpr::GetAsync(cpr::Url {kBaseUrl_ + kListNwsTextProductsEndpoint_}, network::cpr::GetHeader(), parameters)); } return ProcessTextProductLists(asyncResponses); } template requires std::same_as, std::string> std::vector> IemApiProvider::LoadTextProducts(const Range& textProducts) { auto parameters = cpr::Parameters {{"nolimit", "true"}}; logger_->debug("Loading {} text products", textProducts.size()); std::vector> asyncResponses {}; asyncResponses.reserve(textProducts.size()); const std::string endpointUrl = kBaseUrl_ + kNwsTextProductEndpoint_; for (const auto& productId : textProducts) { asyncResponses.emplace_back( productId, cpr::GetAsync(cpr::Url {endpointUrl + productId}, network::cpr::GetHeader(), parameters)); } return ProcessTextProductFiles(asyncResponses); } #ifdef kDateFormat # undef kDateFormat #endif } // namespace scwx::provider