Mustache Templates
Ubicación
apigen-codegen/src/main/resources/templates/
├── java/
├── kotlin/
├── csharp/
├── go-chi/
├── go-gin/
├── python-fastapi/
├── typescript-nestjs/
├── php-laravel/
└── rust-axum/
Sintaxis Quick Reference
{{! Comentario }}
{{variable}} {{! Variable }}
{{{rawHtml}}} {{! Sin escape }}
{{#section}}...{{/section}} {{! Si truthy }}
{{^section}}...{{/section}} {{! Si falsy }}
{{#list}}{{.}}{{/list}} {{! Iterar }}
{{> partial}} {{! Incluir }}
{{#-first}}...{{/-first}} {{! Primer item }}
{{#-last}}...{{/-last}} {{! Último item }}
Patrones Comunes
Imports Condicionales
{{#hasValidation}}
import jakarta.validation.constraints.*;
{{/hasValidation}}
{{#hasJpa}}
import jakarta.persistence.*;
{{/hasJpa}}
Lista con Separadores
{{#columns}}
{{propertyName}}{{^-last}},{{/-last}}
{{/columns}}
If-Else
{{#nullable}}
Optional<{{type}}>
{{/nullable}}
{{^nullable}}
{{type}}
{{/nullable}}
Default Value
{{propertyName}}{{^propertyName}}defaultValue{{/propertyName}}
Context Objects (Java)
public class EntityTemplateContext {
String packageName;
String className;
String tableName;
List<ColumnContext> columns;
boolean hasAuditing;
boolean hasSoftDelete;
}
public class ColumnContext {
String columnName;
String propertyName;
String javaType;
boolean required;
boolean isId;
boolean isRelationship;
String relatedClassName;
}
Template Ejemplo Completo
package {{packageName}}.entity;
import jakarta.persistence.*;
{{#hasLombok}}
import lombok.*;
{{/hasLombok}}
{{#hasValidation}}
import jakarta.validation.constraints.*;
{{/hasValidation}}
{{#hasAuditing}}
import org.springframework.data.annotation.*;
{{/hasAuditing}}
@Entity
@Table(name = "{{tableName}}")
{{#hasLombok}}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
{{/hasLombok}}
public class {{className}} {
@Id
@GeneratedValue(strategy = GenerationType.{{idStrategy}})
private {{idType}} id;
{{#columns}}
{{^isId}}
{{#isRelationship}}
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "{{columnName}}")
private {{relatedClassName}} {{propertyName}};
{{/isRelationship}}
{{^isRelationship}}
@Column(name = "{{columnName}}"{{#required}}, nullable = false{{/required}})
private {{javaType}} {{propertyName}};
{{/isRelationship}}
{{/isId}}
{{/columns}}
{{#hasAuditing}}
@CreatedDate
private Instant createdAt;
@LastModifiedDate
private Instant updatedAt;
{{/hasAuditing}}
}
Testing Templates
@Test
void shouldRenderEntity() {
var context = new EntityTemplateContext();
context.setClassName("User");
context.setTableName("users");
context.setColumns(List.of(
column("name", "String", false)
));
String result = engine.render("java/entity.mustache", context);
assertThat(result)
.contains("public class User")
.contains("@Table(name = \"users\")")
.contains("private String name");
}
Related Skills
codegen-patterns: Patrones de generación
apigen-codegen-dev: Desarrollo del módulo