Started to work on the perl search request

This commit is contained in:
cdricms
2024-01-15 23:33:20 +01:00
parent d1cb8732b4
commit 98463dcb0a
10 changed files with 285 additions and 77 deletions

View File

@@ -45,23 +45,40 @@ public class OpenFoodFactsClient {
public let purchasePlacesTags: String?
}
public func search(_ productName: String, queryParams: SearchQuery? = nil) async throws -> SearchResponse {
let qp = Mirror(reflecting: queryParams ?? {})
var s: String = "?product_name=\(productName)&"
for case let (label?, value) in qp.children {
s += label.camelCaseToSnakeCase() + "=" + (value as! String) + "&"
}
guard let endpoint = baseURL?.appendingPathComponent("search\(s)") else { throw OFFError.invalidURL }
var request = URLRequest(url: endpoint)
request.setValue("application/json", forHTTPHeaderField: "accept")
// public func search(_ productName: String, queryParams: SearchQuery? = nil) async throws -> SearchResponse {
// let qp = Mirror(reflecting: queryParams ?? {})
// var s: String = "?product_name=\(productName)&"
// for case let (label?, value) in qp.children {
// s += label.camelCaseToSnakeCase() + "=" + (value as! String) + "&"
// }
// guard let endpoint = baseURL?.appendingPathComponent("search\(s)") else { throw OFFError.invalidURL }
// var request = URLRequest(url: endpoint)
// request.setValue("application/json", forHTTPHeaderField: "accept")
// let (data, response) = try await URLSession.shared.data(for: request)
// guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
// throw OFFError.invalidResponse
// }
// do {
// return try JSONDecoder().decode(SearchResponse.self, from: data)
// }
// }
//https://wiki.openfoodfacts.org/API/Read/Search#Parameters
public func search(query: PerlSearchQuery) async throws -> SearchResponse {
let endpoint = URL(string: "https://world.openfoodfacts.org/cgi/search.pl?\(query.makeToRequest())")!
print(endpoint)
let request = URLRequest(url: endpoint)
// request.setValue("application/json", forHTTPHeaderField: "accept")
let (data, response) = try await URLSession.shared.data(for: request)
guard let response = response as? HTTPURLResponse, response.statusCode == 200 else {
throw OFFError.invalidResponse
}
do {
return try JSONDecoder().decode(SearchResponse.self, from: data)
}
}
}