Refactored

This commit is contained in:
cdricms
2023-12-14 20:18:34 +01:00
parent 8c958c516a
commit 287561e2e6
13 changed files with 751 additions and 759 deletions

View File

@@ -23,11 +23,12 @@ let package = Package(
// Targets are the basic building blocks of a package, defining a module or a test suite. // Targets are the basic building blocks of a package, defining a module or a test suite.
// Targets can depend on other targets in this package and products from dependencies. // Targets can depend on other targets in this package and products from dependencies.
.target( .target(
name: "swift-openfoodfacts-sdk"), name: "swift-openfoodfacts-sdk", path: "Sources/swift-openfoodfacts-sdk"
),
.executableTarget(name: "exe", dependencies: ["swift-openfoodfacts-sdk"]), .executableTarget(name: "exe", dependencies: ["swift-openfoodfacts-sdk"]),
.testTarget( .testTarget(
name: "swift-openfoodfacts-sdkTests", name: "swift-openfoodfacts-sdkTests",
dependencies: ["swift-openfoodfacts-sdk", "AnyCodable"] dependencies: ["swift-openfoodfacts-sdk"]
), ),
] ]
) )

View File

@@ -29,763 +29,6 @@ public class OpenFoodFactsClient {
return try JSONDecoder().decode(ProductResponse.self, from: data) return try JSONDecoder().decode(ProductResponse.self, from: data)
} }
} }
public struct Ingredient: Codable {
var fromPalmOil: String? = nil
var id: String? = nil
var origin: String? = nil
var percent: Float? = nil
var rank: Int? = 0
var text: String? = nil
var vegan: String? = nil
var vegetarian: String? = nil
private enum CodingKeys: String, CodingKey {
case fromPalmOil = "from_palm_oil"
case id
case origin
case percent
case rank
case text
case vegan
case vegetarian
}
}
public struct LanguagesCodes: Codable {
var en: String? = nil
var fr: String? = nil
var pl: String? = nil
}
public struct NutrientLevels: Codable {
private var fat: String? = nil
private var salt: String? = nil
private var saturatedFat: String? = nil
private var sugars: String? = nil
private enum CodingKeys: String, CodingKey {
case fat
case salt
case saturatedFat = "saturated-fat"
case sugars
}
}
public struct Nutriments: Codable {
var calcium: Float? = 0.0
var calciumValue: Float? = 0.0
var calcium100G: Float? = 0.0
var calciumServing: Float? = 0.0
var calciumUnit: String? = nil
var carbohydrates: Float? = 0.0
var carbohydratesValue: Float? = 0.0
var carbohydrates100G: Float? = 0.0
var carbohydratesServing: Float? = 0.0
var carbohydratesUnit: String? = nil
var carbonFootprintFromKnownIngredientsProduct: Float? = 0.0
var carbonFootprintFromKnownIngredients100G: Float? = 0.0
var carbonFootprintFromKnownIngredientsServing: Float? = 0.0
var cholesterol: Float? = 0.0
var cholesterolValue: Float? = 0.0
var cholesterol100G: Float? = 0.0
var cholesterolServing: Float? = 0.0
var cholesterolUnit: String? = nil
var energy: Int? = 0
var energyKcal: Int? = 0
var energyKj: Int? = 0
var energyValue: Int? = 0
var energyKcalValue: Int? = 0
var energyKjValue: Int? = 0
var energy100G: Int? = 0
var energyKcal100G: Int? = 0
var energyKj100G: Int? = 0
var energyServing: Int? = 0
var energyKcalServing: Double? = 0.0
var energyKjServing: Int? = 0
var energyUnit: String? = nil
var energyKcalUnit: String? = nil
var energyKjUnit: String? = nil
var fat: Float? = 0.0
var fatValue: Float? = 0.0
var fat100G: Float? = 0.0
var fatServing: Float? = 0.0
var fatUnit: String? = nil
var fiber: Float? = 0.0
var fiberValue: Float? = 0.0
var fiber100G: Float? = 0.0
var fiberServing: Float? = 0.0
var fiberUnit: String? = nil
var fruitsVegetablesNutsEstimateFromIngredients100G: Float? = 0.0
var iron: Float? = 0.0
var ironValue: Float? = 0.0
var iron100G: Float? = 0.0
var ironServing: Float? = 0.0
var ironUnit: String? = nil
var novaGroup: Float? = 0.0
var novaGroup100G: Float? = 0.0
var novaGroupServing: Float? = 0.0
var proteins: Float? = 0.0
var proteinsValue: Float? = 0.0
var proteins100G: Float? = 0.0
var proteinsServing: Float? = 0.0
var proteinsUnit: String? = nil
var salt: Float? = 0.0
var saltValue: Float? = 0.0
var salt100G: Float? = 0.0
var saltServing: Float? = 0.0
var saltUnit: String? = nil
var saturatedFat: Float? = 0.0
var saturatedFatValue: Float? = 0.0
var saturatedFat100G: Float? = 0.0
var saturatedFatServing: Float? = 0.0
var saturatedFatUnit: String? = nil
var sodium: Float? = 0.0
var sodiumValue: Float? = 0.0
var sodium100G: Float? = 0.0
var sodiumServing: Float? = 0.0
var sodiumUnit: String? = nil
var sugars: Float? = 0.0
var sugarsValue: Float? = 0.0
var sugars100G: Float? = 0.0
var sugarsServing: Float? = 0.0
var sugarsUnit: String? = nil
var transFat: Float? = 0.0
var transFatValue: Float? = 0.0
var transFat100G: Float? = 0.0
var transFatServing: Float? = 0.0
var transFatUnit: String? = nil
var vitaminA: Float? = 0.0
var vitaminAValue: Float? = 0.0
var vitaminA100G: Float? = 0.0
var vitaminAServing: Float? = 0.0
var vitaminAUnit: String? = nil
var vitaminC: Float? = 0.0
var vitaminCValue: Float? = 0.0
var vitaminC100G: Float? = 0.0
var vitaminCServing: Float? = 0.0
var vitaminCUnit: String? = nil
var vitaminD: Float? = 0.0
var vitaminDValue: Float? = 0.0
var vitaminD100G: Float? = 0.0
var vitaminDServing: Float? = 0.0
var vitaminDUnit: String? = nil
// var other: [String: Any] = [:]
//
// mutating func setDetail(key: String, value: Any) {
// other[key] = value
// }
private enum CodingKeys: String, CodingKey {
case calcium
case calciumValue = "calcium_value"
case calcium100G = "calcium_100g"
case calciumServing = "calcium_serving"
case calciumUnit = "calcium_unit"
case carbohydrates
case carbohydratesValue = "carbohydrates_value"
case carbohydrates100G = "carbohydrates_100g"
case carbohydratesServing = "carbohydrates_serving"
case carbohydratesUnit = "carbohydrates_unit"
case carbonFootprintFromKnownIngredientsProduct = "carbon-footprint-from-known-ingredients_product"
case carbonFootprintFromKnownIngredients100G = "carbon-footprint-from-known-ingredients_100g"
case carbonFootprintFromKnownIngredientsServing = "carbon-footprint-from-known-ingredients_serving"
case cholesterol
case cholesterolValue = "cholesterol_value"
case cholesterol100G = "cholesterol_100g"
case cholesterolServing = "cholesterol_serving"
case cholesterolUnit = "cholesterol_unit"
case energy
case energyKcal = "energy-kcal"
case energyKj = "energy-kj"
case energyValue = "energy_value"
case energyKcalValue = "energy-kcal_value"
case energyKjValue = "energy-kj_value"
case energy100G = "energy_100g"
case energyKcal100G = "energy-kcal_100g"
case energyKj100G = "energy-kj_100g"
case energyServing = "energy_serving"
case energyKcalServing = "energy-kcal_serving"
case energyKjServing = "energy-kj_serving"
case energyUnit = "energy_unit"
case energyKcalUnit = "energy-kcal_unit"
case energyKjUnit = "energy-kj_unit"
case fat
case fatValue = "fat_value"
case fat100G = "fat_100g"
case fatServing = "fat_serving"
case fatUnit = "fat_unit"
case fiber
case fiberValue = "fiber_value"
case fiber100G = "fiber_100g"
case fiberServing = "fiber_serving"
case fiberUnit = "fiber_unit"
case fruitsVegetablesNutsEstimateFromIngredients100G = "fruits-vegetables-nuts-estimate-from-ingredients_100g"
case iron
case ironValue = "iron_value"
case iron100G = "iron_100g"
case ironServing = "iron_serving"
case ironUnit = "iron_unit"
case novaGroup
case novaGroup100G = "nova-group_100g"
case novaGroupServing = "nova-group_serving"
case proteins
case proteinsValue = "proteins_value"
case proteins100G = "proteins_100g"
case proteinsServing = "proteins_serving"
case proteinsUnit = "proteins_unit"
case salt
case saltValue = "salt_value"
case salt100G = "salt_100g"
case saltServing = "salt_serving"
case saltUnit = "salt_unit"
case saturatedFat = "saturated-fat"
case saturatedFatValue = "saturated-fat_value"
case saturatedFat100G = "saturated-fat_100g"
case saturatedFatServing = "saturated-fat_serving"
case saturatedFatUnit = "saturated-fat_unit"
case sodium
case sodiumValue = "sodium_value"
case sodium100G = "sodium_100g"
case sodiumServing = "sodium_serving"
case sodiumUnit = "sodium_unit"
case sugars
case sugarsValue = "sugars_value"
case sugars100G = "sugars_100g"
case sugarsServing = "sugars_serving"
case sugarsUnit = "sugars_unit"
case transFat = "trans-fat"
case transFatValue = "trans-fat_value"
case transFat100G = "trans-fat_100g"
case transFatServing = "trans-fat_serving"
case transFatUnit = "trans-fat_unit"
case vitaminA = "vitamin-a"
case vitaminAValue = "vitamin-a_value"
case vitaminA100G = "vitamin-a_100g"
case vitaminAServing = "vitamin-a_serving"
case vitaminAUnit = "vitamin-a_unit"
case vitaminC = "vitamin-c"
case vitaminCValue = "vitamin-c_value"
case vitaminC100G = "vitamin-c_100g"
case vitaminCServing = "vitamin-c_serving"
case vitaminCUnit = "vitamin-c_unit"
case vitaminD = "vitamin-d"
case vitaminDValue = "vitamin-d_value"
case vitaminD100G = "vitamin-d_100g"
case vitaminDServing = "vitamin-d_serving"
case vitaminDUnit = "vitamin-d_unit"
// case other
}
}
public struct ProductResponse: Codable {
var product: Product?
var code: String?
var status: Int? // or Bool, depending on your needs
var statusVerbose: String?
private enum CodingKeys: String, CodingKey {
case product
case code
case status
case statusVerbose = "status_verbose"
}
}
public struct SelectedImages: Codable {
let front: SelectedImage?
let ingredients: SelectedImage?
let nutrition: SelectedImage?
}
public class SelectedImage: Codable {
var display: SelectedImageItem?
var small: SelectedImageItem?
var thumb: SelectedImageItem?
}
public struct SelectedImageItem: Codable {
let en: String?
let fr: String?
let pl: String?
var url: String {
[en, fr, pl].compactMap { $0 }.first ?? ""
}
}
// public struct Images: Codable {
// private var otherData: [String: Data] = [:]
// mutating func setDetail<T: Encodable>(key: String, value: T) throws {
// let encodedValue = try JSONEncoder().encode(value)
// otherData[key] = encodedValue
// }
// func getDetail<T: Decodable>(key: String, type: T.Type) throws -> T? {
// guard let data = otherData[key] else { return nil }
// return try JSONDecoder().decode(type, from: data)
// }
// }
public struct Source: Codable {
let fields: [String] = []
let id: String? = nil
let images: [String] = []
let importT: Int = 0
let manufacturer: String? = nil
let name: String? = nil
let url: String? = nil
private enum CodingKeys: String, CodingKey {
case fields
case id
case images
case importT = "import_t"
case manufacturer
case name
case url
}
}
public class Product: Codable {
// var images: Images? = Images()
var ingredients: [Ingredient]? = []
var languagesCodes: LanguagesCodes?
var nutrientLevels: NutrientLevels?
var nutriments: Nutriments? = Nutriments()
var selectedImages: SelectedImages?
var sources: [Source]? = []
var additivesN: Int?
var additivesOldN: Int?
var additivesOriginalTags: [String]?
var additivesOldTags: [String]?
var additivesPrevOriginalTags: [String]?
var additivesDebugTags: [String]?
var additivesTags: [String]?
var allergens: String?
var allergensFromIngredients: String?
var allergensFromUser: String?
var allergensHierarchy: [String]?
var allergensLc: String?
var allergensTags: [String]?
var aminoAcidsPrevTags: [String]?
var aminoAcidsTags: [String]?
var brands: String?
var brandsDebugTags: [String]?
var brandsTags: [String]?
var carbonFootprintPercentOfKnownIngredients: String?
var carbonFootprintFromKnownIngredientsDebug: String?
var categories: String?
var categoriesHierarchy: [String]?
var categoriesLc: String?
var categoriesPropertiesTags: [String]?
var categoriesTags: [String]?
var checkersTags: [String]?
var citiesTags: [String]?
var code: String?
var codesTags: [String]?
var comparedToCategory: String?
var complete: Int?
var completedT: Int?
var completeness: Double?
var conservationConditions: String?
var countries: String?
var countriesHierarchy: [String]?
var countriesLc: String?
var countriesDebugTags: [String]?
var countriesTags: [String]?
var correctorsTags: [String]?
var createdT: Int?
var creator: String?
var dataQualityBugsTags: [String]?
var dataQualityErrorsTags: [String]?
var dataQualityInfoTags: [String]?
var dataQualityTags: [String]?
var dataQualityWarningsTags: [String]?
var dataSources: String?
var dataSourcesTags: [String]?
var debugParamSortedLangs: [String]?
var editorsTags: [String]?
var embCodes: String?
var embCodesDebugTags: [String]?
var embCodesOrig: String?
var embCodesTags: [String]?
var entryDatesTags: [String]?
var expirationDate: String?
var expirationDateDebugTags: [String]?
var fruitsVegetablesNuts100GEstimate: Int?
var genericName: String?
var id: String?
var _id: String?
var imageFrontSmallUrl: String?
var imageFrontThumbUrl: String?
var imageFrontUrl: String?
var imageIngredientsUrl: String?
var imageIngredientsSmallUrl: String?
var imageIngredientsThumbUrl: String?
var imageNutritionSmallUrl: String?
var imageNutritionThumbUrl: String?
var imageNutritionUrl: String?
var imageSmallUrl: String?
var imageThumbUrl: String?
var imageUrl: String?
var informersTags: [String]?
var ingredientsAnalysisTags: [String]?
var ingredientsDebug: [String?]?
var ingredientsFromOrThatMayBeFromPalmOilN: Int?
var ingredientsFromPalmOilTags: [String]?
var ingredientsFromPalmOilN: Int?
var ingredientsHierarchy: [String]?
var ingredientsIdsDebug: [String]?
var ingredientsN: Int?
var ingredientsNTags: [String]?
var ingredientsOriginalTags: [String]?
var ingredientsTags: [String]?
var ingredientsText: String?
var ingredientsTextDebug: String?
var ingredientsTextWithAllergens: String?
var ingredientsThatMayBeFromPalmOilN: Int?
var ingredientsThatMayBeFromPalmOilTags: [String]?
var interfaceVersionCreated: String?
var interfaceVersionModified: String?
var keywords: [String]?
var knownIngredientsN: Int?
var labels: String?
var labelsHierarchy: [String]?
var labelsLc: String?
var labelsPrevHierarchy: [String]?
var labelsPrevTags: [String]?
var labelsTags: [String]?
var labelsDebugTags: [String]?
var lang: String?
var langDebugTags: [String]?
var languagesHierarchy: [String]?
var languagesTags: [String]?
var lastEditDatesTags: [String]?
var lastEditor: String?
var lastImageDatesTags: [String]?
var lastImageT: Int?
var lastModifiedBy: String?
var lastModifiedT: Int?
var lc: String?
var link: String?
var linkDebugTags: [String]?
var manufacturingPlaces: String?
var manufacturingPlacesDebugTags: [String]?
var manufacturingPlacesTags: [String]?
var maxImgid: String?
var mineralsPrevTags: [String]?
var mineralsTags: [String]?
var miscTags: [String]?
var netWeightUnit: String?
var netWeightValue: String?
var nutritionDataPer: String?
var nutritionScoreWarningNoFruitsVegetablesNuts: Int?
var noNutritionData: String?
var novaGroup: String?
var novaGroups: String?
var novaGroupDebug: String?
var novaGroupTags: [String]?
var novaGroupsTags: [String]?
var nucleotidesPrevTags: [String]?
var nucleotidesTags: [String]?
var nutrientLevelsTags: [String]?
var nutritionData: String?
var nutritionDataPerDebugTags: [String]?
var nutritionDataPrepared: String?
var nutritionDataPreparedPer: String?
var nutritionGrades: String?
var nutritionScoreBeverage: Int?
var nutritionScoreDebug: String?
var nutritionScoreWarningNoFiber: Int?
var nutritionGradesTags: [String]?
var origins: String?
var originsDebugTags: [String]?
var originsTags: [String]?
var otherInformation: String?
var otherNutritionalSubstancesTags: [String]?
var packaging: String?
var packagingDebugTags: [String]?
var packagingTags: [String]?
var photographersTags: [String]?
var pnnsGroups1: String?
var pnnsGroups2: String?
var pnnsGroups1Tags: [String]?
var pnnsGroups2Tags: [String]?
var popularityKey: Int?
var producerVersionId: String?
var productName: String?
var productQuantity: String?
var purchasePlaces: String?
var purchasePlacesDebugTags: [String]?
var purchasePlacesTags: [String]?
var qualityTags: [String]?
var quantity: String?
var quantityDebugTags: [String]?
var recyclingInstructionsToDiscard: String?
var rev: Int?
var servingQuantity: String?
var servingSize: String?
var servingSizeDebugTags: [String]?
var sortkey: Int?
var states: String?
var statesHierarchy: [String]?
var statesTags: [String]?
var stores: String?
var storesDebugTags: [String]?
var storesTags: [String]?
var traces: String?
var tracesFromIngredients: String?
var tracesHierarchy: [String]?
var tracesDebugTags: [String]?
var tracesFromUser: String?
var tracesLc: String?
var tracesTags: [String]?
var unknownIngredientsN: Int?
var unknownNutrientsTags: [String]?
var updateKey: String?
var vitaminsPrevTags: [String]?
var vitaminsTags: [String]?
}
private enum CodingKeys: String, CodingKey {
case images
case ingredients
case languagesCodes = "languages_codes"
case nutrientLevels = "nutrient_levels"
case nutriments
case selectedImages = "selected_images"
case sources
case additivesN = "additives_n"
case additivesOldN = "additives_old_n"
case additivesOriginalTags = "additives_original_tags"
case additivesOldTags = "additives_old_tags"
case additivesPrevOriginalTags = "additives_prev_original_tags"
case additivesDebugTags = "additives_debug_tags"
case additivesTags = "additives_tags"
case allergens
case allergensFromIngredients = "allergens_from_ingredients"
case allergensFromUser = "allergens_from_user"
case allergensHierarchy = "allergens_hierarchy"
case allergensLc = "allergens_lc"
case allergensTags = "allergens_tags"
case aminoAcidsPrevTags = "amino_acids_prev_tags"
case aminoAcidsTags = "amino_acids_tags"
case brands
case brandsDebugTags = "brands_debug_tags"
case brandsTags = "brands_tags"
case carbonFootprintPercentOfKnownIngredients = "carbon_footprint_percent_of_known_ingredients"
case carbonFootprintFromKnownIngredientsDebug = "carbon_footprint_from_known_ingredients_debug"
case categories
case categoriesHierarchy = "categories_hierarchy"
case categoriesLc = "categories_lc"
case categoriesPropertiesTags = "categories_properties_tags"
case categoriesTags = "categories_tags"
case checkersTags = "checkers_tags"
case citiesTags = "cities_tags"
case code
case codesTags = "codes_tags"
case comparedToCategory = "compared_to_category"
case complete
case completedT = "completed_t"
case completeness
case conservationConditions = "conservation_conditions"
case countries
case countriesHierarchy = "countries_hierarchy"
case countriesLc = "countries_lc"
case countriesDebugTags = "countries_debug_tags"
case countriesTags = "countries_tags"
case correctorsTags = "correctors_tags"
case createdT = "created_t"
case creator
case dataQualityBugsTags = "data_quality_bugs_tags"
case dataQualityErrorsTags = "data_quality_errors_tags"
case dataQualityInfoTags = "data_quality_info_tags"
case dataQualityTags = "data_quality_tags"
case dataQualityWarningsTags = "data_quality_warnings_tags"
case dataSources = "data_sources"
case dataSourcesTags = "data_sources_tags"
case debugParamSortedLangs = "debug_param_sorted_langs"
case editorsTags = "editors_tags"
case embCodes = "emb_codes"
case embCodesDebugTags = "emb_codes_debug_tags"
case embCodesOrig = "emb_codes_orig"
case embCodesTags = "emb_codes_tags"
case entryDatesTags = "entry_dates_tags"
case expirationDate = "expiration_date"
case expirationDateDebugTags = "expiration_date_debug_tags"
case fruitsVegetablesNuts100GEstimate = "fruits-vegetables-nuts_100g_estimate"
case genericName
case id
case imageFrontSmallUrl = "image_front_small_url"
case imageFrontThumbUrl = "image_front_thumb_url"
case imageFrontUrl = "image_front_url"
case imageIngredientsUrl = "image_ingredients_url"
case imageIngredientsSmallUrl = "image_ingredients_small_url"
case imageIngredientsThumbUrl = "image_ingredients_thumb_url"
case imageNutritionSmallUrl = "image_nutrition_small_url"
case imageNutritionThumbUrl = "image_nutrition_thumb_url"
case imageNutritionUrl = "image_nutrition_url"
case imageSmallUrl = "image_small_url"
case imageThumbUrl = "image_thumb_url"
case imageUrl = "image_url"
case informersTags = "informers_tags"
case ingredientsAnalysisTags = "ingredients_analysis_tags"
case ingredientsDebug = "ingredients_debug"
case ingredientsFromOrThatMayBeFromPalmOilN = "ingredients_from_or_that_may_be_from_palm_oil_n"
case ingredientsFromPalmOilTags = "ingredients_from_palm_oil_tags"
case ingredientsFromPalmOilN = "ingredients_from_palm_oil_n"
case ingredientsHierarchy = "ingredients_hierarchy"
case ingredientsIdsDebug = "ingredients_ids_debug"
case ingredientsN = "ingredients_n"
case ingredientsNTags = "ingredients_n_tags"
case ingredientsOriginalTags = "ingredients_original_tags"
case ingredientsTags = "ingredients_tags"
case ingredientsText = "ingredients_text"
case ingredientsTextDebug = "ingredients_text_debug"
case ingredientsTextWithAllergens = "ingredients_text_with_allergens"
case ingredientsThatMayBeFromPalmOilN = "ingredients_that_may_be_from_palm_oil_n"
case ingredientsThatMayBeFromPalmOilTags = "ingredients_that_may_be_from_palm_oil_tags"
case interfaceVersionCreated = "interface_version_created"
case interfaceVersionModified = "interface_version_modified"
case keywords
case knownIngredientsN = "known_ingredients_n"
case labels
case labelsHierarchy = "labels_hierarchy"
case labelsLc = "labels_lc"
case labelsPrevHierarchy = "labels_prev_hierarchy"
case labelsPrevTags = "labels_prev_tags"
case labelsTags = "labels_tags"
case labelsDebugTags = "labels_debug_tags"
case lang
case langDebugTags = "lang_debug_tags"
case languagesHierarchy = "languages_hierarchy"
case languagesTags = "languages_tags"
case lastEditDatesTags = "last_edit_dates_tags"
case lastEditor = "last_editor"
case lastImageDatesTags = "last_image_dates_tags"
case lastImageT = "last_image_t"
case lastModifiedBy = "last_modified_by"
case lastModifiedT = "last_modified_t"
case lc
case link
case linkDebugTags = "link_debug_tags"
case manufacturingPlaces = "manufacturing_places"
case manufacturingPlacesDebugTags = "manufacturing_places_debug_tags"
case manufacturingPlacesTags = "manufacturing_places_tags"
case maxImgid = "max_imgid"
case mineralsPrevTags = "minerals_prev_tags"
case mineralsTags = "minerals_tags"
case miscTags = "misc_tags"
case netWeightUnit = "net_weight_unit"
case netWeightValue = "net_weight_value"
case nutritionDataPer = "nutrition_data_per"
case nutritionScoreWarningNoFruitsVegetablesNuts = "nutrition_score_warning_no_fruits_vegetables_nuts"
case noNutritionData = "no_nutrition_data"
case novaGroup = "nova_group"
case novaGroups = "nova_groups"
case novaGroupDebug = "nova_group_debug"
case novaGroupTags = "nova_group_tags"
case novaGroupsTags = "nova_groups_tags"
case nucleotidesPrevTags = "nucleotides_prev_tags"
case nucleotidesTags = "nucleotides_tags"
case nutrientLevelsTags = "nutrient_levels_tags"
case nutritionData = "nutrition_data"
case nutritionDataPerDebugTags = "nutrition_data_per_debug_tags"
case nutritionDataPrepared = "nutrition_data_prepared"
case nutritionDataPreparedPer = "nutrition_data_prepared_per"
case nutritionGrades = "nutrition_grades"
case nutritionScoreBeverage = "nutrition_score_beverage"
case nutritionScoreDebug = "nutrition_score_debug"
case nutritionScoreWarningNoFiber = "nutrition_score_warning_no_fiber"
case nutritionGradesTags = "nutrition_grades_tags"
case origins
case originsDebugTags = "origins_debug_tags"
case originsTags = "origins_tags"
case otherInformation = "other_information"
case otherNutritionalSubstancesTags = "other_nutritional_substances_tags"
case packaging
case packagingDebugTags = "packaging_debug_tags"
case packagingTags = "packaging_tags"
case photographersTags = "photographers_tags"
case pnnsGroups1 = "pnns_groups_1"
case pnnsGroups2 = "pnns_groups_2"
case pnnsGroups1Tags = "pnns_groups_1_tags"
case pnnsGroups2Tags = "pnns_groups_2_tags"
case popularityKey = "popularity_key"
case producerVersionId = "producer_version_id"
case productName = "product_name"
case productQuantity = "product_quantity"
case purchasePlaces = "purchase_places"
case purchasePlacesDebugTags = "purchase_places_debug_tags"
case purchasePlacesTags = "purchase_places_tags"
case qualityTags = "quality_tags"
case quantity
case quantityDebugTags = "quantity_debug_tags"
case recyclingInstructionsToDiscard = "recycling_instructions_to_discard"
case rev
case servingQuantity = "serving_quantity"
case servingSize = "serving_size"
case servingSizeDebugTags = "serving_size_debug_tags"
case sortkey
case states
case statesHierarchy = "states_hierarchy"
case statesTags = "states_tags"
case stores
case storesDebugTags = "stores_debug_tags"
case storesTags = "stores_tags"
case traces
case tracesFromIngredients = "traces_from_ingredients"
case tracesHierarchy = "traces_hierarchy"
case tracesDebugTags = "traces_debug_tags"
case tracesFromUser = "traces_from_user"
case tracesLc = "traces_lc"
case tracesTags = "traces_tags"
case unknownIngredientsN = "unknown_ingredients_n"
case unknownNutrientsTags = "unknown_nutrients_tags"
case updateKey = "update_key"
case vitaminsPrevTags = "vitamins_prev_tags"
case vitaminsTags = "vitamins_tags"
}
} }
enum OFFError: Error { enum OFFError: Error {

View File

@@ -0,0 +1,13 @@
// public struct Images: Codable {
// private var otherData: [String: Data] = [:]
// mutating func setDetail<T: Encodable>(key: String, value: T) throws {
// let encodedValue = try JSONEncoder().encode(value)
// otherData[key] = encodedValue
// }
// func getDetail<T: Decodable>(key: String, type: T.Type) throws -> T? {
// guard let data = otherData[key] else { return nil }
// return try JSONDecoder().decode(type, from: data)
// }
// }

View File

@@ -0,0 +1,21 @@
public struct Ingredient: Codable {
var fromPalmOil: String? = nil
var id: String? = nil
var origin: String? = nil
var percent: Float? = nil
var rank: Int? = 0
var text: String? = nil
var vegan: String? = nil
var vegetarian: String? = nil
private enum CodingKeys: String, CodingKey {
case fromPalmOil = "from_palm_oil"
case id
case origin
case percent
case rank
case text
case vegan
case vegetarian
}
}

View File

@@ -0,0 +1,6 @@
public struct LanguagesCodes: Codable {
var en: String? = nil
var fr: String? = nil
var pl: String? = nil
}

View File

@@ -0,0 +1,13 @@
public struct NutrientLevels: Codable {
private var fat: String? = nil
private var salt: String? = nil
private var saturatedFat: String? = nil
private var sugars: String? = nil
private enum CodingKeys: String, CodingKey {
case fat
case salt
case saturatedFat = "saturated-fat"
case sugars
}
}

View File

@@ -0,0 +1,243 @@
public struct Nutriments: Codable {
var calcium: Float? = 0.0
var calciumValue: Float? = 0.0
var calcium100G: Float? = 0.0
var calciumServing: Float? = 0.0
var calciumUnit: String? = nil
var carbohydrates: Float? = 0.0
var carbohydratesValue: Float? = 0.0
var carbohydrates100G: Float? = 0.0
var carbohydratesServing: Float? = 0.0
var carbohydratesUnit: String? = nil
var carbonFootprintFromKnownIngredientsProduct: Float? = 0.0
var carbonFootprintFromKnownIngredients100G: Float? = 0.0
var carbonFootprintFromKnownIngredientsServing: Float? = 0.0
var cholesterol: Float? = 0.0
var cholesterolValue: Float? = 0.0
var cholesterol100G: Float? = 0.0
var cholesterolServing: Float? = 0.0
var cholesterolUnit: String? = nil
var energy: Int? = 0
var energyKcal: Int? = 0
var energyKj: Int? = 0
var energyValue: Int? = 0
var energyKcalValue: Int? = 0
var energyKjValue: Int? = 0
var energy100G: Int? = 0
var energyKcal100G: Int? = 0
var energyKj100G: Int? = 0
var energyServing: Int? = 0
var energyKcalServing: Double? = 0.0
var energyKjServing: Int? = 0
var energyUnit: String? = nil
var energyKcalUnit: String? = nil
var energyKjUnit: String? = nil
var fat: Float? = 0.0
var fatValue: Float? = 0.0
var fat100G: Float? = 0.0
var fatServing: Float? = 0.0
var fatUnit: String? = nil
var fiber: Float? = 0.0
var fiberValue: Float? = 0.0
var fiber100G: Float? = 0.0
var fiberServing: Float? = 0.0
var fiberUnit: String? = nil
var fruitsVegetablesNutsEstimateFromIngredients100G: Float? = 0.0
var iron: Float? = 0.0
var ironValue: Float? = 0.0
var iron100G: Float? = 0.0
var ironServing: Float? = 0.0
var ironUnit: String? = nil
var novaGroup: Float? = 0.0
var novaGroup100G: Float? = 0.0
var novaGroupServing: Float? = 0.0
var proteins: Float? = 0.0
var proteinsValue: Float? = 0.0
var proteins100G: Float? = 0.0
var proteinsServing: Float? = 0.0
var proteinsUnit: String? = nil
var salt: Float? = 0.0
var saltValue: Float? = 0.0
var salt100G: Float? = 0.0
var saltServing: Float? = 0.0
var saltUnit: String? = nil
var saturatedFat: Float? = 0.0
var saturatedFatValue: Float? = 0.0
var saturatedFat100G: Float? = 0.0
var saturatedFatServing: Float? = 0.0
var saturatedFatUnit: String? = nil
var sodium: Float? = 0.0
var sodiumValue: Float? = 0.0
var sodium100G: Float? = 0.0
var sodiumServing: Float? = 0.0
var sodiumUnit: String? = nil
var sugars: Float? = 0.0
var sugarsValue: Float? = 0.0
var sugars100G: Float? = 0.0
var sugarsServing: Float? = 0.0
var sugarsUnit: String? = nil
var transFat: Float? = 0.0
var transFatValue: Float? = 0.0
var transFat100G: Float? = 0.0
var transFatServing: Float? = 0.0
var transFatUnit: String? = nil
var vitaminA: Float? = 0.0
var vitaminAValue: Float? = 0.0
var vitaminA100G: Float? = 0.0
var vitaminAServing: Float? = 0.0
var vitaminAUnit: String? = nil
var vitaminC: Float? = 0.0
var vitaminCValue: Float? = 0.0
var vitaminC100G: Float? = 0.0
var vitaminCServing: Float? = 0.0
var vitaminCUnit: String? = nil
var vitaminD: Float? = 0.0
var vitaminDValue: Float? = 0.0
var vitaminD100G: Float? = 0.0
var vitaminDServing: Float? = 0.0
var vitaminDUnit: String? = nil
// var other: [String: Any] = [:]
//
// mutating func setDetail(key: String, value: Any) {
// other[key] = value
// }
private enum CodingKeys: String, CodingKey {
case calcium
case calciumValue = "calcium_value"
case calcium100G = "calcium_100g"
case calciumServing = "calcium_serving"
case calciumUnit = "calcium_unit"
case carbohydrates
case carbohydratesValue = "carbohydrates_value"
case carbohydrates100G = "carbohydrates_100g"
case carbohydratesServing = "carbohydrates_serving"
case carbohydratesUnit = "carbohydrates_unit"
case carbonFootprintFromKnownIngredientsProduct = "carbon-footprint-from-known-ingredients_product"
case carbonFootprintFromKnownIngredients100G = "carbon-footprint-from-known-ingredients_100g"
case carbonFootprintFromKnownIngredientsServing = "carbon-footprint-from-known-ingredients_serving"
case cholesterol
case cholesterolValue = "cholesterol_value"
case cholesterol100G = "cholesterol_100g"
case cholesterolServing = "cholesterol_serving"
case cholesterolUnit = "cholesterol_unit"
case energy
case energyKcal = "energy-kcal"
case energyKj = "energy-kj"
case energyValue = "energy_value"
case energyKcalValue = "energy-kcal_value"
case energyKjValue = "energy-kj_value"
case energy100G = "energy_100g"
case energyKcal100G = "energy-kcal_100g"
case energyKj100G = "energy-kj_100g"
case energyServing = "energy_serving"
case energyKcalServing = "energy-kcal_serving"
case energyKjServing = "energy-kj_serving"
case energyUnit = "energy_unit"
case energyKcalUnit = "energy-kcal_unit"
case energyKjUnit = "energy-kj_unit"
case fat
case fatValue = "fat_value"
case fat100G = "fat_100g"
case fatServing = "fat_serving"
case fatUnit = "fat_unit"
case fiber
case fiberValue = "fiber_value"
case fiber100G = "fiber_100g"
case fiberServing = "fiber_serving"
case fiberUnit = "fiber_unit"
case fruitsVegetablesNutsEstimateFromIngredients100G = "fruits-vegetables-nuts-estimate-from-ingredients_100g"
case iron
case ironValue = "iron_value"
case iron100G = "iron_100g"
case ironServing = "iron_serving"
case ironUnit = "iron_unit"
case novaGroup
case novaGroup100G = "nova-group_100g"
case novaGroupServing = "nova-group_serving"
case proteins
case proteinsValue = "proteins_value"
case proteins100G = "proteins_100g"
case proteinsServing = "proteins_serving"
case proteinsUnit = "proteins_unit"
case salt
case saltValue = "salt_value"
case salt100G = "salt_100g"
case saltServing = "salt_serving"
case saltUnit = "salt_unit"
case saturatedFat = "saturated-fat"
case saturatedFatValue = "saturated-fat_value"
case saturatedFat100G = "saturated-fat_100g"
case saturatedFatServing = "saturated-fat_serving"
case saturatedFatUnit = "saturated-fat_unit"
case sodium
case sodiumValue = "sodium_value"
case sodium100G = "sodium_100g"
case sodiumServing = "sodium_serving"
case sodiumUnit = "sodium_unit"
case sugars
case sugarsValue = "sugars_value"
case sugars100G = "sugars_100g"
case sugarsServing = "sugars_serving"
case sugarsUnit = "sugars_unit"
case transFat = "trans-fat"
case transFatValue = "trans-fat_value"
case transFat100G = "trans-fat_100g"
case transFatServing = "trans-fat_serving"
case transFatUnit = "trans-fat_unit"
case vitaminA = "vitamin-a"
case vitaminAValue = "vitamin-a_value"
case vitaminA100G = "vitamin-a_100g"
case vitaminAServing = "vitamin-a_serving"
case vitaminAUnit = "vitamin-a_unit"
case vitaminC = "vitamin-c"
case vitaminCValue = "vitamin-c_value"
case vitaminC100G = "vitamin-c_100g"
case vitaminCServing = "vitamin-c_serving"
case vitaminCUnit = "vitamin-c_unit"
case vitaminD = "vitamin-d"
case vitaminDValue = "vitamin-d_value"
case vitaminD100G = "vitamin-d_100g"
case vitaminDServing = "vitamin-d_serving"
case vitaminDUnit = "vitamin-d_unit"
// case other
}
}

View File

@@ -0,0 +1,400 @@
public class Product: Codable {
// var images: Images? = Images()
var ingredients: [Ingredient]? = []
var languagesCodes: LanguagesCodes?
var nutrientLevels: NutrientLevels?
var nutriments: Nutriments? = Nutriments()
var selectedImages: SelectedImages?
var sources: [Source]? = []
var additivesN: Int?
var additivesOldN: Int?
var additivesOriginalTags: [String]?
var additivesOldTags: [String]?
var additivesPrevOriginalTags: [String]?
var additivesDebugTags: [String]?
var additivesTags: [String]?
var allergens: String?
var allergensFromIngredients: String?
var allergensFromUser: String?
var allergensHierarchy: [String]?
var allergensLc: String?
var allergensTags: [String]?
var aminoAcidsPrevTags: [String]?
var aminoAcidsTags: [String]?
var brands: String?
var brandsDebugTags: [String]?
var brandsTags: [String]?
var carbonFootprintPercentOfKnownIngredients: String?
var carbonFootprintFromKnownIngredientsDebug: String?
var categories: String?
var categoriesHierarchy: [String]?
var categoriesLc: String?
var categoriesPropertiesTags: [String]?
var categoriesTags: [String]?
var checkersTags: [String]?
var citiesTags: [String]?
var code: String?
var codesTags: [String]?
var comparedToCategory: String?
var complete: Int?
var completedT: Int?
var completeness: Double?
var conservationConditions: String?
var countries: String?
var countriesHierarchy: [String]?
var countriesLc: String?
var countriesDebugTags: [String]?
var countriesTags: [String]?
var correctorsTags: [String]?
var createdT: Int?
var creator: String?
var dataQualityBugsTags: [String]?
var dataQualityErrorsTags: [String]?
var dataQualityInfoTags: [String]?
var dataQualityTags: [String]?
var dataQualityWarningsTags: [String]?
var dataSources: String?
var dataSourcesTags: [String]?
var debugParamSortedLangs: [String]?
var editorsTags: [String]?
var embCodes: String?
var embCodesDebugTags: [String]?
var embCodesOrig: String?
var embCodesTags: [String]?
var entryDatesTags: [String]?
var expirationDate: String?
var expirationDateDebugTags: [String]?
var fruitsVegetablesNuts100GEstimate: Int?
var genericName: String?
var id: String?
var _id: String?
var imageFrontSmallUrl: String?
var imageFrontThumbUrl: String?
var imageFrontUrl: String?
var imageIngredientsUrl: String?
var imageIngredientsSmallUrl: String?
var imageIngredientsThumbUrl: String?
var imageNutritionSmallUrl: String?
var imageNutritionThumbUrl: String?
var imageNutritionUrl: String?
var imageSmallUrl: String?
var imageThumbUrl: String?
var imageUrl: String?
var informersTags: [String]?
var ingredientsAnalysisTags: [String]?
var ingredientsDebug: [String?]?
var ingredientsFromOrThatMayBeFromPalmOilN: Int?
var ingredientsFromPalmOilTags: [String]?
var ingredientsFromPalmOilN: Int?
var ingredientsHierarchy: [String]?
var ingredientsIdsDebug: [String]?
var ingredientsN: Int?
var ingredientsNTags: [String]?
var ingredientsOriginalTags: [String]?
var ingredientsTags: [String]?
var ingredientsText: String?
var ingredientsTextDebug: String?
var ingredientsTextWithAllergens: String?
var ingredientsThatMayBeFromPalmOilN: Int?
var ingredientsThatMayBeFromPalmOilTags: [String]?
var interfaceVersionCreated: String?
var interfaceVersionModified: String?
var keywords: [String]?
var knownIngredientsN: Int?
var labels: String?
var labelsHierarchy: [String]?
var labelsLc: String?
var labelsPrevHierarchy: [String]?
var labelsPrevTags: [String]?
var labelsTags: [String]?
var labelsDebugTags: [String]?
var lang: String?
var langDebugTags: [String]?
var languagesHierarchy: [String]?
var languagesTags: [String]?
var lastEditDatesTags: [String]?
var lastEditor: String?
var lastImageDatesTags: [String]?
var lastImageT: Int?
var lastModifiedBy: String?
var lastModifiedT: Int?
var lc: String?
var link: String?
var linkDebugTags: [String]?
var manufacturingPlaces: String?
var manufacturingPlacesDebugTags: [String]?
var manufacturingPlacesTags: [String]?
var maxImgid: String?
var mineralsPrevTags: [String]?
var mineralsTags: [String]?
var miscTags: [String]?
var netWeightUnit: String?
var netWeightValue: String?
var nutritionDataPer: String?
var nutritionScoreWarningNoFruitsVegetablesNuts: Int?
var noNutritionData: String?
var novaGroup: String?
var novaGroups: String?
var novaGroupDebug: String?
var novaGroupTags: [String]?
var novaGroupsTags: [String]?
var nucleotidesPrevTags: [String]?
var nucleotidesTags: [String]?
var nutrientLevelsTags: [String]?
var nutritionData: String?
var nutritionDataPerDebugTags: [String]?
var nutritionDataPrepared: String?
var nutritionDataPreparedPer: String?
var nutritionGrades: String?
var nutritionScoreBeverage: Int?
var nutritionScoreDebug: String?
var nutritionScoreWarningNoFiber: Int?
var nutritionGradesTags: [String]?
var origins: String?
var originsDebugTags: [String]?
var originsTags: [String]?
var otherInformation: String?
var otherNutritionalSubstancesTags: [String]?
var packaging: String?
var packagingDebugTags: [String]?
var packagingTags: [String]?
var photographersTags: [String]?
var pnnsGroups1: String?
var pnnsGroups2: String?
var pnnsGroups1Tags: [String]?
var pnnsGroups2Tags: [String]?
var popularityKey: Int?
var producerVersionId: String?
var productName: String?
var productQuantity: String?
var purchasePlaces: String?
var purchasePlacesDebugTags: [String]?
var purchasePlacesTags: [String]?
var qualityTags: [String]?
var quantity: String?
var quantityDebugTags: [String]?
var recyclingInstructionsToDiscard: String?
var rev: Int?
var servingQuantity: String?
var servingSize: String?
var servingSizeDebugTags: [String]?
var sortkey: Int?
var states: String?
var statesHierarchy: [String]?
var statesTags: [String]?
var stores: String?
var storesDebugTags: [String]?
var storesTags: [String]?
var traces: String?
var tracesFromIngredients: String?
var tracesHierarchy: [String]?
var tracesDebugTags: [String]?
var tracesFromUser: String?
var tracesLc: String?
var tracesTags: [String]?
var unknownIngredientsN: Int?
var unknownNutrientsTags: [String]?
var updateKey: String?
var vitaminsPrevTags: [String]?
var vitaminsTags: [String]?
}
private enum CodingKeys: String, CodingKey {
case images
case ingredients
case languagesCodes = "languages_codes"
case nutrientLevels = "nutrient_levels"
case nutriments
case selectedImages = "selected_images"
case sources
case additivesN = "additives_n"
case additivesOldN = "additives_old_n"
case additivesOriginalTags = "additives_original_tags"
case additivesOldTags = "additives_old_tags"
case additivesPrevOriginalTags = "additives_prev_original_tags"
case additivesDebugTags = "additives_debug_tags"
case additivesTags = "additives_tags"
case allergens
case allergensFromIngredients = "allergens_from_ingredients"
case allergensFromUser = "allergens_from_user"
case allergensHierarchy = "allergens_hierarchy"
case allergensLc = "allergens_lc"
case allergensTags = "allergens_tags"
case aminoAcidsPrevTags = "amino_acids_prev_tags"
case aminoAcidsTags = "amino_acids_tags"
case brands
case brandsDebugTags = "brands_debug_tags"
case brandsTags = "brands_tags"
case carbonFootprintPercentOfKnownIngredients = "carbon_footprint_percent_of_known_ingredients"
case carbonFootprintFromKnownIngredientsDebug = "carbon_footprint_from_known_ingredients_debug"
case categories
case categoriesHierarchy = "categories_hierarchy"
case categoriesLc = "categories_lc"
case categoriesPropertiesTags = "categories_properties_tags"
case categoriesTags = "categories_tags"
case checkersTags = "checkers_tags"
case citiesTags = "cities_tags"
case code
case codesTags = "codes_tags"
case comparedToCategory = "compared_to_category"
case complete
case completedT = "completed_t"
case completeness
case conservationConditions = "conservation_conditions"
case countries
case countriesHierarchy = "countries_hierarchy"
case countriesLc = "countries_lc"
case countriesDebugTags = "countries_debug_tags"
case countriesTags = "countries_tags"
case correctorsTags = "correctors_tags"
case createdT = "created_t"
case creator
case dataQualityBugsTags = "data_quality_bugs_tags"
case dataQualityErrorsTags = "data_quality_errors_tags"
case dataQualityInfoTags = "data_quality_info_tags"
case dataQualityTags = "data_quality_tags"
case dataQualityWarningsTags = "data_quality_warnings_tags"
case dataSources = "data_sources"
case dataSourcesTags = "data_sources_tags"
case debugParamSortedLangs = "debug_param_sorted_langs"
case editorsTags = "editors_tags"
case embCodes = "emb_codes"
case embCodesDebugTags = "emb_codes_debug_tags"
case embCodesOrig = "emb_codes_orig"
case embCodesTags = "emb_codes_tags"
case entryDatesTags = "entry_dates_tags"
case expirationDate = "expiration_date"
case expirationDateDebugTags = "expiration_date_debug_tags"
case fruitsVegetablesNuts100GEstimate = "fruits-vegetables-nuts_100g_estimate"
case genericName
case id
case imageFrontSmallUrl = "image_front_small_url"
case imageFrontThumbUrl = "image_front_thumb_url"
case imageFrontUrl = "image_front_url"
case imageIngredientsUrl = "image_ingredients_url"
case imageIngredientsSmallUrl = "image_ingredients_small_url"
case imageIngredientsThumbUrl = "image_ingredients_thumb_url"
case imageNutritionSmallUrl = "image_nutrition_small_url"
case imageNutritionThumbUrl = "image_nutrition_thumb_url"
case imageNutritionUrl = "image_nutrition_url"
case imageSmallUrl = "image_small_url"
case imageThumbUrl = "image_thumb_url"
case imageUrl = "image_url"
case informersTags = "informers_tags"
case ingredientsAnalysisTags = "ingredients_analysis_tags"
case ingredientsDebug = "ingredients_debug"
case ingredientsFromOrThatMayBeFromPalmOilN = "ingredients_from_or_that_may_be_from_palm_oil_n"
case ingredientsFromPalmOilTags = "ingredients_from_palm_oil_tags"
case ingredientsFromPalmOilN = "ingredients_from_palm_oil_n"
case ingredientsHierarchy = "ingredients_hierarchy"
case ingredientsIdsDebug = "ingredients_ids_debug"
case ingredientsN = "ingredients_n"
case ingredientsNTags = "ingredients_n_tags"
case ingredientsOriginalTags = "ingredients_original_tags"
case ingredientsTags = "ingredients_tags"
case ingredientsText = "ingredients_text"
case ingredientsTextDebug = "ingredients_text_debug"
case ingredientsTextWithAllergens = "ingredients_text_with_allergens"
case ingredientsThatMayBeFromPalmOilN = "ingredients_that_may_be_from_palm_oil_n"
case ingredientsThatMayBeFromPalmOilTags = "ingredients_that_may_be_from_palm_oil_tags"
case interfaceVersionCreated = "interface_version_created"
case interfaceVersionModified = "interface_version_modified"
case keywords
case knownIngredientsN = "known_ingredients_n"
case labels
case labelsHierarchy = "labels_hierarchy"
case labelsLc = "labels_lc"
case labelsPrevHierarchy = "labels_prev_hierarchy"
case labelsPrevTags = "labels_prev_tags"
case labelsTags = "labels_tags"
case labelsDebugTags = "labels_debug_tags"
case lang
case langDebugTags = "lang_debug_tags"
case languagesHierarchy = "languages_hierarchy"
case languagesTags = "languages_tags"
case lastEditDatesTags = "last_edit_dates_tags"
case lastEditor = "last_editor"
case lastImageDatesTags = "last_image_dates_tags"
case lastImageT = "last_image_t"
case lastModifiedBy = "last_modified_by"
case lastModifiedT = "last_modified_t"
case lc
case link
case linkDebugTags = "link_debug_tags"
case manufacturingPlaces = "manufacturing_places"
case manufacturingPlacesDebugTags = "manufacturing_places_debug_tags"
case manufacturingPlacesTags = "manufacturing_places_tags"
case maxImgid = "max_imgid"
case mineralsPrevTags = "minerals_prev_tags"
case mineralsTags = "minerals_tags"
case miscTags = "misc_tags"
case netWeightUnit = "net_weight_unit"
case netWeightValue = "net_weight_value"
case nutritionDataPer = "nutrition_data_per"
case nutritionScoreWarningNoFruitsVegetablesNuts = "nutrition_score_warning_no_fruits_vegetables_nuts"
case noNutritionData = "no_nutrition_data"
case novaGroup = "nova_group"
case novaGroups = "nova_groups"
case novaGroupDebug = "nova_group_debug"
case novaGroupTags = "nova_group_tags"
case novaGroupsTags = "nova_groups_tags"
case nucleotidesPrevTags = "nucleotides_prev_tags"
case nucleotidesTags = "nucleotides_tags"
case nutrientLevelsTags = "nutrient_levels_tags"
case nutritionData = "nutrition_data"
case nutritionDataPerDebugTags = "nutrition_data_per_debug_tags"
case nutritionDataPrepared = "nutrition_data_prepared"
case nutritionDataPreparedPer = "nutrition_data_prepared_per"
case nutritionGrades = "nutrition_grades"
case nutritionScoreBeverage = "nutrition_score_beverage"
case nutritionScoreDebug = "nutrition_score_debug"
case nutritionScoreWarningNoFiber = "nutrition_score_warning_no_fiber"
case nutritionGradesTags = "nutrition_grades_tags"
case origins
case originsDebugTags = "origins_debug_tags"
case originsTags = "origins_tags"
case otherInformation = "other_information"
case otherNutritionalSubstancesTags = "other_nutritional_substances_tags"
case packaging
case packagingDebugTags = "packaging_debug_tags"
case packagingTags = "packaging_tags"
case photographersTags = "photographers_tags"
case pnnsGroups1 = "pnns_groups_1"
case pnnsGroups2 = "pnns_groups_2"
case pnnsGroups1Tags = "pnns_groups_1_tags"
case pnnsGroups2Tags = "pnns_groups_2_tags"
case popularityKey = "popularity_key"
case producerVersionId = "producer_version_id"
case productName = "product_name"
case productQuantity = "product_quantity"
case purchasePlaces = "purchase_places"
case purchasePlacesDebugTags = "purchase_places_debug_tags"
case purchasePlacesTags = "purchase_places_tags"
case qualityTags = "quality_tags"
case quantity
case quantityDebugTags = "quantity_debug_tags"
case recyclingInstructionsToDiscard = "recycling_instructions_to_discard"
case rev
case servingQuantity = "serving_quantity"
case servingSize = "serving_size"
case servingSizeDebugTags = "serving_size_debug_tags"
case sortkey
case states
case statesHierarchy = "states_hierarchy"
case statesTags = "states_tags"
case stores
case storesDebugTags = "stores_debug_tags"
case storesTags = "stores_tags"
case traces
case tracesFromIngredients = "traces_from_ingredients"
case tracesHierarchy = "traces_hierarchy"
case tracesDebugTags = "traces_debug_tags"
case tracesFromUser = "traces_from_user"
case tracesLc = "traces_lc"
case tracesTags = "traces_tags"
case unknownIngredientsN = "unknown_ingredients_n"
case unknownNutrientsTags = "unknown_nutrients_tags"
case updateKey = "update_key"
case vitaminsPrevTags = "vitamins_prev_tags"
case vitaminsTags = "vitamins_tags"
}

View File

@@ -0,0 +1,14 @@
public struct ProductResponse: Codable {
var product: Product?
var code: String?
var status: Int? // or Bool, depending on your needs
var statusVerbose: String?
private enum CodingKeys: String, CodingKey {
case product
case code
case status
case statusVerbose = "status_verbose"
}
}

View File

@@ -0,0 +1,5 @@
public class SelectedImage: Codable {
var display: SelectedImageItem?
var small: SelectedImageItem?
var thumb: SelectedImageItem?
}

View File

@@ -0,0 +1,9 @@
public struct SelectedImageItem: Codable {
let en: String?
let fr: String?
let pl: String?
var url: String {
[en, fr, pl].compactMap { $0 }.first ?? ""
}
}

View File

@@ -0,0 +1,5 @@
public struct SelectedImages: Codable {
let front: SelectedImage?
let ingredients: SelectedImage?
let nutrition: SelectedImage?
}

View File

@@ -0,0 +1,19 @@
public struct Source: Codable {
let fields: [String] = []
let id: String? = nil
let images: [String] = []
let importT: Int = 0
let manufacturer: String? = nil
let name: String? = nil
let url: String? = nil
private enum CodingKeys: String, CodingKey {
case fields
case id
case images
case importT = "import_t"
case manufacturer
case name
case url
}
}