diff --git a/TopModel.Generator.Core/GeneratorConfigBase.cs b/TopModel.Generator.Core/GeneratorConfigBase.cs index 2f37f1b6..b023a90c 100644 --- a/TopModel.Generator.Core/GeneratorConfigBase.cs +++ b/TopModel.Generator.Core/GeneratorConfigBase.cs @@ -116,7 +116,7 @@ public string GetConvertedValue(string value, Domain? fromDomain, Domain? toDoma { value = GetImplementation(converter)!.Text .Replace("{value}", value) - .ParseTemplate(fromDomain, toDomain, Language, this); + .ParseTemplate(fromDomain, toDomain, this); } } diff --git a/TopModel.Generator.Core/TemplateExtensions.cs b/TopModel.Generator.Core/TemplateExtensions.cs index 2c828ee2..550e6c05 100644 --- a/TopModel.Generator.Core/TemplateExtensions.cs +++ b/TopModel.Generator.Core/TemplateExtensions.cs @@ -114,7 +114,7 @@ public static string ParseTemplate(this string template, Endpoint e, string[] pa return result; } - public static string ParseTemplate(this string template, Domain domainFrom, Domain domainTo, string targetLanguage, GeneratorConfigBase config, string? tag = null) + public static string ParseTemplate(this string template, Domain domainFrom, Domain domainTo, GeneratorConfigBase config, string? tag = null) { if (string.IsNullOrEmpty(template) || !template.Contains('{')) { @@ -124,7 +124,7 @@ public static string ParseTemplate(this string template, Domain domainFrom, Doma var result = template; foreach (var t in template.ExtractVariables()) { - result = result.Replace(t.Value, ResolveVariable(t.Value.Trim('{', '}'), domainFrom, domainTo, targetLanguage, config, tag)); + result = result.Replace(t.Value, ResolveVariable(t.Value.Trim('{', '}'), domainFrom, domainTo, config, tag)); } return result; @@ -184,6 +184,11 @@ private static string ResolveVariable(this string input, IFieldProperty fp, stri return ResolveVariable(input["endpoint.".Length..], fp.Parent, parameters, config, tag); } + if (input.StartsWith("domain.")) + { + return ResolveVariable(input["domain.".Length..], fp.Domain, config, tag); + } + if (input.StartsWith("association.") && (fp is AssociationProperty ap || fp is AliasProperty alp && alp.Property is AssociationProperty asp)) { var asso = fp switch @@ -371,7 +376,7 @@ private static string ResolveVariable(this string input, Endpoint e, string[] pa return result; } - private static string ResolveVariable(this string input, Domain domain, string targetLanguage, GeneratorConfigBase config, string? tag = null) + private static string ResolveVariable(this string input, Domain domain, GeneratorConfigBase config, string? tag = null) { var transform = input.GetTransformation(); var variable = input.Split(':').First(); @@ -382,20 +387,20 @@ private static string ResolveVariable(this string input, Domain domain, string t "length" => transform(domain.Length?.ToString() ?? string.Empty), "scale" => transform(domain.Scale?.ToString() ?? string.Empty), "name" => transform(domain.Name ?? string.Empty), - "type" => transform(domain.Implementations.GetValueOrDefault(targetLanguage)?.Type ?? string.Empty), + "type" => transform(domain.Implementations.GetValueOrDefault(config.Language)?.Type ?? string.Empty), var i => config.ResolveVariables(config.ResolveGlobalVariables($@"{{{i}}}").Trim('{', '}'), tag: tag) }; } - private static string ResolveVariable(this string input, Domain domainFrom, Domain domainTo, string targetLanguage, GeneratorConfigBase config, string? tag = null) + private static string ResolveVariable(this string input, Domain domainFrom, Domain domainTo, GeneratorConfigBase config, string? tag = null) { if (input.StartsWith("from.")) { - return ResolveVariable(input["from.".Length..], domainFrom, targetLanguage, config, tag); + return ResolveVariable(input["from.".Length..], domainFrom, config, tag); } else { - return ResolveVariable(input["to.".Length..], domainTo, targetLanguage, config, tag); + return ResolveVariable(input["to.".Length..], domainTo, config, tag); } } } \ No newline at end of file diff --git a/docs/model/decorators.md b/docs/model/decorators.md index ac194ed4..6f4bd8dc 100644 --- a/docs/model/decorators.md +++ b/docs/model/decorators.md @@ -123,7 +123,7 @@ _Remarque 2 : `extends`, `implements` et `generateInterface` ne sont évidemment ### Variables -Il est possible que certaines propriétés des décorateurs dépendent de la classe sur laquelle vous l'ajouter. Vous pourriez par exemple ajouter une interface `java` générique de la classe sur laquelle est ajouté le décorateur. +Il est possible que certaines propriétés des décorateurs dépendent de la classe sur laquelle vous l'ajoutez. Vous pourriez par exemple ajouter une interface `java` générique de la classe sur laquelle est ajouté le décorateur. ```java /** @@ -166,7 +166,6 @@ Permet de généraliser le comportement du décorateur `MonInterface` à toutes Actuellement, il est possible d'utiliser ces variables dans une classe : -- `primaryKey.name` - `trigram` - `name` - `sqlName` @@ -174,6 +173,8 @@ Actuellement, il est possible d'utiliser ces variables dans une classe : - `label` - `pluralName` - `module` +- `primaryKey.*` permet d'accéder à toutes les variables accessibles dans les templates de propriété, pour la clé primaire de la classe qui fait l'objet du décorateur +- `properties[i]` permet d'accéder à toutes les variables accessibles dans les templates de propriété, pour la ième propriété de la classe qui fait l'objet du décorateur Et ces variables dans un endpoint : @@ -182,6 +183,8 @@ Et ces variables dans un endpoint : - `route` - `method` - `module` +- `returns.*` permet d'accéder à toutes les variables accessibles dans les templates de propriété, pour la propriété définie dans le `returns` du endpoint +- `params[i].*` permet d'accéder à toutes les variables accessibles dans les templates de propriété, pour le ième param du endpoint qui fait l'objet du décorateur Dans les propriétés d'implémentation : @@ -190,6 +193,8 @@ Dans les propriétés d'implémentation : - `extends` - `imports` +Il est également possible d'utiliser n'importe quelle variable définie dans la configuration (`variable` ou `tagVariable`). + Les templates des domaines des propriétés sont également valorisés. ### Paramètres diff --git a/docs/model/domains.md b/docs/model/domains.md index 98ef34ed..dfec7613 100644 --- a/docs/model/domains.md +++ b/docs/model/domains.md @@ -87,7 +87,7 @@ domain: ## Templating -Il est possible que certaines propriétés des domaines dépendent de la propriété sur laquelle vous l'ajouter. Vous pourriez par exemple ajouter une annotation `@Label` dans le code `java` qui aurait besoin du libelle renseigné dans TopModel. +Il est possible que certaines propriétés des domaines dépendent de la propriété sur laquelle vous l'ajoutez. Vous pourriez par exemple ajouter une annotation `@Label` dans le code `java` qui aurait besoin du libelle renseigné dans TopModel. Pour utiliser un attribut de la propriété dans le domaine, il suffit de référencer cette propriété entre accolades : @@ -104,12 +104,10 @@ domain: - topmodel.sample.custom.annotation.Label ``` -Le code généré sera ainsi différent selon la propriété sur laquelle vous allez effectivement ajouter ce domaine/ +Le code généré sera ainsi différent selon la propriété sur laquelle vous allez effectivement ajouter ce domaine Actuellement il est possible d'utiliser ces variables -- `class.name` -- `class.sqlName` - `name` - `trigram` - `label` @@ -117,14 +115,17 @@ Actuellement il est possible d'utiliser ces variables - `required` - `resourceKey` - `defaultValue` +- `class.*` ou `parent.*` ou `endpoint.*` : permet d'accéder à toutes les variables accessibles dans les templates de classe, pour l'objet parent de la propriété (la classe ou le endpoint) +- `domain.*` permet d'accéder à toutes les variables accessibles dans les templates de domaine, pour le domain de la propriété (plus utile pour les décorateurs...) Dans le cadre d'une composition, il est possible d'utiliser ces variables : -- `class.name` -- `composition.name` - `name` - `label` - `comment` +- `composition.*` : permet d'accéder à toutes les variables accessibles dans les templates de classe, pour la classe qui fait l'objet de la composition + +Il est également possible d'utiliser n'importe quelle variable définie dans la configuration (`variable` ou `tagVariable`). Le tout dans les propriétés d'implémentation :