EntityReference<T>.fromJson constructor

EntityReference<T>.fromJson(
  1. Map<String, dynamic> json, {
  2. Type? type,
  3. String? typeName,
  4. EntityHandler<T>? entityHandler,
  5. EntityProvider? entityProvider,
  6. EntityHandlerProvider? entityHandlerProvider,
  7. EntityFetcher<T>? entityFetcher,
  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 entityToJson) and instantiated through fromEntityMap.

Implementation

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

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

    typeName ??= entityReferenceType;
    var id = json['id'];
    var entity = json['entity'];

    if (entity != null) {
      if (id != null) {
        entityHandler ??= EntityReferenceBase._resolveEntityHandlerGlobal(
          type,
          typeName,
          entityHandlerProvider,
          entityProvider,
        );

        if (entityHandler != null) {
          var instantiator = EntityInstantiatorHandler(
            entityHandler,
            id,
            entity,
            entityCache: entityCache,
            entityHandlerProvider: entityHandlerProvider,
          );

          return EntityReference<T>.fromEntityInstantiator(
            id,
            instantiator,
            type: type,
            typeName: typeName,
            entityHandler: entityHandler,
            entityProvider: entityProvider,
            entityHandlerProvider: entityHandlerProvider,
            entityFetcher: entityFetcher,
            entityCache: entityCache,
            checkGenericType: false,
          )._autoCast();
        }
      }

      var entityMapCast = _resolveEntityMap(entity);

      return EntityReference<T>.fromEntityMap(
        entityMapCast,
        type: type,
        typeName: typeName,
        entityHandler: entityHandler,
        entityProvider: entityProvider,
        entityHandlerProvider: entityHandlerProvider,
        entityFetcher: entityFetcher,
        entityCache: entityCache,
        checkGenericType: false,
      )._autoCast();
    } else if (id != null) {
      return EntityReference<T>.fromID(
        id,
        type: type,
        typeName: typeName,
        entityHandler: entityHandler,
        entityProvider: entityProvider,
        entityHandlerProvider: entityHandlerProvider,
        entityFetcher: entityFetcher,
        entityCache: entityCache,
        checkGenericType: false,
      )._autoCast();
    } else {
      return EntityReference<T>.asNull(
        type: type,
        typeName: typeName,
        entityHandler: entityHandler,
        entityProvider: entityProvider,
        entityHandlerProvider: entityHandlerProvider,
        entityFetcher: entityFetcher,
        entityCache: entityCache,
        checkGenericType: false,
      )._autoCast();
    }
  } else {
    entityHandler ??= EntityReferenceBase._resolveEntityHandlerGlobal(
      type,
      typeName,
      entityHandlerProvider,
      entityProvider,
    );

    if (entityHandler != null) {
      var id = entityHandler.getIDFromMap(json);
      if (id != null) {
        var instantiator = EntityInstantiatorHandler(
          entityHandler,
          id,
          json,
          entityCache: entityCache,
          entityHandlerProvider: entityHandlerProvider,
        );

        return EntityReference<T>.fromEntityInstantiator(
          id,
          instantiator,
          type: type,
          typeName: typeName,
          entityHandler: entityHandler,
          entityProvider: entityProvider,
          entityHandlerProvider: entityHandlerProvider,
          entityFetcher: entityFetcher,
          entityCache: entityCache,
          checkGenericType: false,
        )._autoCast();
      }
    }

    return EntityReference<T>.fromEntityMap(
      json,
      type: type,
      typeName: typeName,
      entityHandler: entityHandler,
      entityProvider: entityProvider,
      entityHandlerProvider: entityHandlerProvider,
      entityFetcher: entityFetcher,
      entityCache: entityCache,
      checkGenericType: false,
    )._autoCast();
  }
}