Product.fromJson constructor

Product.fromJson(
  1. Map<String, dynamic> json
)

Implementation

factory Product.fromJson(Map<String, dynamic> json) {
  final Product result = _$ProductFromJson(json);
  for (final String key in json.keys) {
    if (key.contains('debug')) {
      continue;
    }
    // If the JSON contained *_in_languages fields,
    // _$ProductFromJson(json) already decoded them
    if (key.endsWith('_in_languages')) {
      continue;
    }
    // The OFF API can give values in all available languages for some
    // of the fields ('product_name_languages'), and in a requested list of
    // languages for an additional number of fields
    // (`product_name_[2 letter language code]`).
    // We store those values in a more structured maps like
    // [productNameInLanguages].
    if (key == ProductField.NAME_ALL_LANGUAGES.offTag) {
      final Map<OpenFoodFactsLanguage, String>? localized =
          _getLocalizedStrings(json[key]);
      if (localized != null) {
        result.productNameInLanguages ??= {};
        result.productNameInLanguages!.addAll(localized);
      }
    } else if (key == ProductField.INGREDIENTS_TEXT_ALL_LANGUAGES.offTag) {
      final Map<OpenFoodFactsLanguage, String>? localized =
          _getLocalizedStrings(json[key]);
      if (localized != null) {
        result.ingredientsTextInLanguages ??= {};
        result.ingredientsTextInLanguages!.addAll(localized);
      }
    } else if (key == ProductField.PACKAGING_TEXT_ALL_LANGUAGES.offTag) {
      final Map<OpenFoodFactsLanguage, String>? localized =
          _getLocalizedStrings(json[key]);
      if (localized != null) {
        result.packagingTextInLanguages ??= {};
        result.packagingTextInLanguages!.addAll(localized);
      }
    } else if (key.startsWith(ProductField.NAME_IN_LANGUAGES.offTag)) {
      final OpenFoodFactsLanguage lang =
          _langFrom(key, ProductField.NAME_IN_LANGUAGES.offTag);
      if (lang != OpenFoodFactsLanguage.UNDEFINED) {
        result.productNameInLanguages ??= {};
        result.productNameInLanguages![lang] = json[key];
      }
    } else if (key
        .startsWith(ProductField.CATEGORIES_TAGS_IN_LANGUAGES.offTag)) {
      final OpenFoodFactsLanguage lang =
          _langFrom(key, ProductField.CATEGORIES_TAGS_IN_LANGUAGES.offTag);
      final values = _jsonValueToList(json[key]);
      if (lang != OpenFoodFactsLanguage.UNDEFINED && values != null) {
        result.categoriesTagsInLanguages ??= {};
        result.categoriesTagsInLanguages![lang] = values;
      }
    } else if (key
        .startsWith(ProductField.INGREDIENTS_TAGS_IN_LANGUAGES.offTag)) {
      final OpenFoodFactsLanguage lang =
          _langFrom(key, ProductField.INGREDIENTS_TAGS_IN_LANGUAGES.offTag);
      final values = _jsonValueToList(json[key]);
      if (lang != OpenFoodFactsLanguage.UNDEFINED && values != null) {
        result.ingredientsTagsInLanguages ??= {};
        result.ingredientsTagsInLanguages![lang] = values;
      }
    } else if (key
        .startsWith(ProductField.IMAGES_FRESHNESS_IN_LANGUAGES.offTag)) {
      final OpenFoodFactsLanguage lang =
          _langFrom(key, ProductField.IMAGES_FRESHNESS_IN_LANGUAGES.offTag);
      if (lang != OpenFoodFactsLanguage.UNDEFINED) {
        final Map<ImageField, int> values =
            _jsonValueToImagesFreshness(json[key], lang);
        result.imagesFreshnessInLanguages ??= {};
        result.imagesFreshnessInLanguages![lang] = values;
      }
    } else if (key.startsWith(ProductField.LABELS_TAGS_IN_LANGUAGES.offTag)) {
      final OpenFoodFactsLanguage lang =
          _langFrom(key, ProductField.LABELS_TAGS_IN_LANGUAGES.offTag);
      final values = _jsonValueToList(json[key]);
      if (lang != OpenFoodFactsLanguage.UNDEFINED && values != null) {
        result.labelsTagsInLanguages ??= {};
        result.labelsTagsInLanguages![lang] = values;
      }
    } else if (key
        .startsWith(ProductField.COUNTRIES_TAGS_IN_LANGUAGES.offTag)) {
      final OpenFoodFactsLanguage lang =
          _langFrom(key, ProductField.COUNTRIES_TAGS_IN_LANGUAGES.offTag);
      final values = _jsonValueToList(json[key]);
      if (lang != OpenFoodFactsLanguage.UNDEFINED && values != null) {
        result.countriesTagsInLanguages ??= {};
        result.countriesTagsInLanguages![lang] = values;
      }
    } else if (key
        .startsWith(ProductField.INGREDIENTS_TEXT_IN_LANGUAGES.offTag)) {
      final OpenFoodFactsLanguage lang =
          _langFrom(key, ProductField.INGREDIENTS_TEXT_IN_LANGUAGES.offTag);
      if (lang != OpenFoodFactsLanguage.UNDEFINED) {
        result.ingredientsTextInLanguages ??= {};
        result.ingredientsTextInLanguages![lang] = json[key];
      }
    } else if (key
        .startsWith(ProductField.PACKAGING_TEXT_IN_LANGUAGES.offTag)) {
      final OpenFoodFactsLanguage lang =
          _langFrom(key, ProductField.PACKAGING_TEXT_IN_LANGUAGES.offTag);
      if (lang != OpenFoodFactsLanguage.UNDEFINED) {
        result.packagingTextInLanguages ??= {};
        result.packagingTextInLanguages![lang] = json[key];
      }
    }
  }
  return result;
}