2012-07-03 10 views
10

Questo è il mio modello di Jinja per generare il codice C# dal mio modello di datiCome chiamare ricorsivamente una macro in jinja2?

using System; 

namespace {{ domain["ns"] }} { 
{% for class in domain["content"] %} 
    public class {{ class["name"] }} { 

    #region Inners 
     {{ class["innerClass"] }} 
    #endregion 

    #region Props 
    {% for field in class["content"] %} 
     {% if field["readonly"] == "true" %} 
      {% set readonly="private" %} 
     {% else %} 
      {% set readonly="" %} 
     {% endif %} 
     public {{ field["type"] }} {{ field["name"] }} {get; 
       {{ readonly }} set{ 

        if ({{ field["constraint"] }}){ 
         {{ field["name"] }}=value; 
        }else { 
         throw new Exception("Inserted value for {{ field["name"] }} is not valid!"); 
        } 
       } 
     } 
    {% endfor %} 
    #endregion 
    } 
{% endfor %} 
} 

questa è la mia domanda, per generare classi interne, voglio ricorsivamente anello sul mio modello di dati, come posso passare la classe [" innerClass "] come parametro alla mia prima istruzione?

+2

per rendere una struttura ad albero in modo ricorsivo si potrebbe anche usare ciclo ricorsivo impresa di Jinja2 ure, [example] (http://stackoverflow.com/a/10961991/4279) – jfs

+0

@ J.F.Sebastian: È più pulito della mia soluzione. Dovresti rendere il tuo commento una risposta. – Helgi

+0

@Helgi Il tuo è molto più semplice comunque. La sintassi del ciclo ricorsivo di Jinja è più confusa della semplice ricorsione normale. –

risposta

12

È possibile utilizzare macros, scrivere una macro per il rendering di classe, e quindi chiamare in modo ricorsivo:

{% macro render_class(class) -%} 
class {{ class.name }} 
{ 
{% for field in class.fields %} 
    int {{ field }}; 
{% endfor %} 
{% for subclass in class.subclasses %} 
{{ render_class(subclass) }} 
{% endfor %} 
} 
{%- endmacro %} 

{% for class in classes %} 
{{ render_class(class) }} 
{% endfor %} 

Questo funziona bene, ma non tratta con il corretto rientro di sottoclassi, cedendo codice come questo:

class Bar 
{ 
    int meow; 
    int bark; 

class SubBar 
{ 
    int joe; 
    int pete; 
} 
} 
+1

Grazie mille per la tua risposta chiara e utile – Pooya

Problemi correlati