Macro ne fonctionne pas avec une variable en argument

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Salut tous le monde.

J'ai un problème avec les macros en langage Crystal.

En effet, ceux-ci sont exécuté lors du passage du compilateur, sauf que les routes de mon routeurs son paramétré à partir d'un fichier YAML

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
---
base:
  name: api
  description: Exemple
  version: 1
collections:
  users:
    description: Users
    verbs: CRUD # Default
    klass: User # Default
    collection_actions: # /users/something
      get:
      - something
      - else
    resource_actions: # /users/:id/something
      get:
      - messages
  emails:
    description: Emails
    verbs: R
    klass: Email

Ma structure est la suivante:

  • L'utilisateur allume son serveur Web.
  • Le serveur web lit le fichier de conf et enregistre les routes dans des nodes. (Routeur + Nodes => https://github.com/Cruder/Opali/tree/feature/4/router/src/Opali/router )
  • L'utilisateur veux accédé à la page /users
  • Le serveur regarde toutes les nodes jusqu'à ce qu'il trouve la bonne node. (Sinon 404)
  • Le serveur appel le bon controller avec la bonne méthode.
  • Le serveur transforme en JSON le résultat puis l'envoie à l'utilisateur.

Voici la macro qui me pose problème:

1
2
3
macro controller_call(controller, params, method)
  {{controller.id}}.new({{params}}).{{method.id}}()
end

En appelant ma macro comme suit, je n'ai aucun problèmes

1
controller_call("UsersController", CONTEXT, "index")

Mais en passant par une variable, cela ne fonctionne plus, et me donne ceci

1
@klass.new(...).@method()

Comment faire pour pouvoir appeler le bon controlleur? (sachant qu'ils héritent tous de Opali::Base::Controller)

Merci de votre aide.

(J'ai fait un petit git diff https://github.com/Cruder/Opali/compare/feature/4/router pour voir plus facilement le code correspondant)

edit elyppire : titre modifié pour plus de clarté.

Édité par elyppire

+0 -0
Auteur du sujet

Je pense avoir une solution qui est de lire le fichier à la compilation et de coder un switch case dans ma macro. Mais du coup ca risque de me faire des gros switch case dans mon code (même si c'est des macros et que cela ne se vois pas)

Es-ce que c'est une bonne solution? (Dans tous les cas, ca ressemble juste à une solution de secours :/)

Merci de votre aide.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte