klee-contrib / topmodel

Outil de modélisation et générateurs pour divers langages
https://klee-contrib.github.io/topmodel/
MIT License
11 stars 12 forks source link

Propriétés comme paramètres de mapper `from` #328

Closed JabX closed 11 months ago

JabX commented 11 months ago

Fix #313

Cette PR introduit la possibilité de spécifier des propriétés (en plus des classes) dans la paramètres d'un mapper from. Par exemple :

class:
  name: MyDTO
  comment: DTO.
  properties:
    - alias:
        class: MyEntity

    - composition: MyOtherDTO
      name: others
      domain: DO_LIST
      comment: Other DTOs

  mappers:
    from:
      - params:
          - class: MyEntity
          - property:
              composition: MyOtherDTO
              name: others
              domain: DO_LIST
              comment: Other DTOs

Le mapping se fera vers la propriété de la classe qui a le même nom. On vérifie que les deux propriétés ont le même domaine, et dans le cas d'une composition, que ce sont bien des compositions des deux côtés et de la même classe. Il est possible de surcharger la propriété cible en renseignant target (au même niveau que property), si jamais les noms ne peuvent pas correspondre pour une raison ou une autre.

Tous les types de propriétés sont supportés, y compris les alias de plusieurs propriétés (cela fera donc autant de mappings qu'il y a de propriétés dans l'alias).

Les mappings renseignés via des propriétés comptent comme des mappings explicites sur les classes et obéissent donc aux mêmes règles (impossible d'initialiser 2 fois la même propriété, et ils ont la priorité sur les mappings implictes générés depuis les classes). De même, il n'est pas possible d'avoir deux paramètres de même nom.

Le paramètre est obligatoire si la propriété est obligatoire. Pour pouvoir gérer les compositions de la même façon, il est désormais possible de spécifier qu'une composition est required ou non (pour être cohérent avec l'existant, la valeur par défaut est true). En dehors d'un mapper, une composition required: false ne sera pas initialisée dans le constructeur de la classe avec un objet "vide".

La valeur par défaut de la propriété sera utilisée dans le mapper si elle est renseignée. Par conséquent, une propriété avec une valeur par défaut sera forcément non obligatoire. Un nouveau contrôle a été ajouté dans les mappers pour vérifier que les paramètres obligatoires sont bien en premier.

Les classes utilisées pour définir le caractère persistant/non persistant du mapper, ainsi que s'il doit être généré ou non, restent toujours celles qui sont définies en directement en paramètres. Autrement dit, une classe référencée dans une propriété (via une association, un alias ou une composition) n'a pas d'influence dessus (attention du coup aux classes qui pourraient manquer pour des compositions, c'est pareil que pour les endpoints).

Cette PR n'implémente (pour l'instant... :) ) que ces paramètres en C#. Le générateur Java ignore pour l'instant ces paramètres dans la génération.

Cette fonctionnalité remplace l'usage de this pour créer un mapping depuis un paramètre classe vers une composition sans domaine, puisqu'il est possible de le faire de manière plus logique avec une composition en paramètre. Il s'agit donc d'un breaking change puisqu'il faudra faire cette migration.