FEMAssignmentPolicy.m 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. // For License please refer to LICENSE file in the root of FastEasyMapping project
  2. #import "FEMAssignmentPolicy.h"
  3. #import "FEMRelationshipAssignmentContext.h"
  4. #import "FEMExcludableCollection.h"
  5. #import "FEMMergeableCollection.h"
  6. FEMAssignmentPolicy FEMAssignmentPolicyAssign = ^id(FEMRelationshipAssignmentContext * context) {
  7. return context.targetRelationshipValue;
  8. };
  9. FEMAssignmentPolicy FEMAssignmentPolicyObjectMerge = ^id(FEMRelationshipAssignmentContext *context) {
  10. return context.targetRelationshipValue ?: context.sourceRelationshipValue;
  11. };
  12. FEMAssignmentPolicy FEMAssignmentPolicyCollectionMerge = ^id(FEMRelationshipAssignmentContext *context) {
  13. if (!context.targetRelationshipValue) return context.sourceRelationshipValue;
  14. NSCAssert(
  15. [context.targetRelationshipValue conformsToProtocol:@protocol(FEMMergeableCollection)],
  16. @"Collection %@ should support protocol %@",
  17. NSStringFromClass([context.targetRelationshipValue class]),
  18. NSStringFromProtocol(@protocol(FEMMergeableCollection))
  19. );
  20. return [context.targetRelationshipValue collectionByMergingObjects:context.sourceRelationshipValue];
  21. };
  22. FEMAssignmentPolicy FEMAssignmentPolicyObjectReplace = ^id(FEMRelationshipAssignmentContext *context) {
  23. if (context.sourceRelationshipValue && ![context.sourceRelationshipValue isEqual:context.targetRelationshipValue]) {
  24. [context deleteRelationshipObject:context.sourceRelationshipValue];
  25. }
  26. return context.targetRelationshipValue;
  27. };
  28. FEMAssignmentPolicy FEMAssignmentPolicyCollectionReplace = ^id(FEMRelationshipAssignmentContext *context) {
  29. if (!context.sourceRelationshipValue) return context.targetRelationshipValue;
  30. if (context.targetRelationshipValue) {
  31. NSCAssert(
  32. [context.sourceRelationshipValue conformsToProtocol:@protocol(FEMExcludableCollection)],
  33. @"Collection %@ should support protocol %@",
  34. NSStringFromClass([context.targetRelationshipValue class]),
  35. NSStringFromProtocol(@protocol(FEMExcludableCollection))
  36. );
  37. id objectsToDelete = [(id <FEMExcludableCollection>) context.sourceRelationshipValue collectionByExcludingObjects:context.targetRelationshipValue];
  38. for (id object in objectsToDelete) {
  39. [context deleteRelationshipObject:object];
  40. }
  41. } else {
  42. for (id object in context.sourceRelationshipValue) {
  43. [context deleteRelationshipObject:object];
  44. }
  45. }
  46. return context.targetRelationshipValue;
  47. };