EntityReferenceList<T>.fromJson constructor

EntityReferenceList<T>.fromJson(
  1. Map<String, dynamic> json, {
  2. Type? type,
  3. String? typeName,
  4. EntityHandler<T>? entityHandler,
  5. EntityProvider? entityProvider,
  6. EntityHandlerProvider? entityHandlerProvider,
  7. EntitiesFetcher<T>? entitiesFetcher,
  8. EntityCache? entityCache,
})

Creates an EntityReference from a JSON Map. If json has an entry EntityReference it will be treated as a Map from toJson, otherwise will be treated as an entity JSON (a Map from entitiesToJson) and instantiated through fromEntityMap.

Implementation

factory EntityReferenceList.fromJson(Map<String, dynamic> json,
    {Type? type,
    String? typeName,
    EntityHandler<T>? entityHandler,
    EntityProvider? entityProvider,
    EntityHandlerProvider? entityHandlerProvider,
    EntitiesFetcher<T>? entitiesFetcher,
    EntityCache? entityCache}) {
  var entityReferenceType = json['EntityReferenceList'];

  if (entityReferenceType != null) {
    if (entityReferenceType is! String) {
      throw ArgumentError("Invalid `EntityReference` JSON: $json");
    }

    typeName ??= entityReferenceType;
    var ids = json['ids'];
    var entities = json['entities'];

    if (entities != null && entities is List) {
      var entitiesMaps = entities is List<Map<String, dynamic>?>
          ? entities
          : entities.map((e) {
              var m = e is Map ? e : TypeParser.parseMap(e);
              return m is Map<String, dynamic>
                  ? m
                  : m?.map((key, value) => MapEntry('$key', value));
            }).toList(growable: false);

      return EntityReferenceList<T>.fromEntitiesMaps(entitiesMaps,
              type: type,
              typeName: typeName,
              entityHandler: entityHandler,
              entityProvider: entityProvider,
              entityHandlerProvider: entityHandlerProvider,
              entitiesFetcher: entitiesFetcher,
              entityCache: entityCache,
              checkGenericType: false)
          ._autoCast();
    } else if (ids != null && ids is List<Object?>) {
      return EntityReferenceList<T>.fromIDs(ids,
              type: type,
              typeName: typeName,
              entityHandler: entityHandler,
              entityProvider: entityProvider,
              entityHandlerProvider: entityHandlerProvider,
              entitiesFetcher: entitiesFetcher,
              entityCache: entityCache,
              checkGenericType: false)
          ._autoCast();
    } else {
      return EntityReferenceList<T>.asEmpty(
              type: type,
              typeName: typeName,
              entityHandler: entityHandler,
              entityProvider: entityProvider,
              entityHandlerProvider: entityHandlerProvider,
              entitiesFetcher: entitiesFetcher,
              entityCache: entityCache,
              checkGenericType: false)
          ._autoCast();
    }
  } else {
    var entityReferenceType = json['EntityReference'];

    if (entityReferenceType != null) {
      var entityReference =
          EntityReference<T>.fromJson(json, entityCache: entityCache);

      var isNull = entityReference.isNull;
      var id = entityReference.id;
      var entity = entityReference.entity;

      return EntityReferenceList<T>._(
              entityReference.type,
              null,
              isNull || id == null ? null : [id],
              isNull || entity == null ? null : [entity],
              null,
              entityReference.entityHandler,
              entityReference.entityProvider,
              entityReference._entityHandlerProvider,
              null,
              entityCache,
              false)
          ._autoCast();
    }

    return EntityReferenceList<T>.fromEntitiesMaps(
            <Map<String, dynamic>>[json],
            type: type,
            typeName: typeName,
            entityHandler: entityHandler,
            entityProvider: entityProvider,
            entityHandlerProvider: entityHandlerProvider,
            entitiesFetcher: entitiesFetcher,
            entityCache: entityCache,
            checkGenericType: false)
        ._autoCast();
  }
}