diff --git a/TopModel.Generator.Core/TemplateExtensions.cs b/TopModel.Generator.Core/TemplateExtensions.cs index 75c5e887..b4157041 100644 --- a/TopModel.Generator.Core/TemplateExtensions.cs +++ b/TopModel.Generator.Core/TemplateExtensions.cs @@ -116,6 +116,18 @@ private static IEnumerable ExtractVariables(this string input) return regex.Matches(input).Cast(); } + private static string ResolveCustomProperty(string input, Dictionary customProperties) + { + var transform = input.GetTransformation(); + var propertyName = input.Split(':').First(); + if (customProperties.TryGetValue(propertyName, out var value)) + { + return transform(value); + } + + return string.Empty; + } + private static string ResolveVariable(this string input, Domain domain, GeneratorConfigBase config, string? tag = null) { var transform = input.GetTransformation(); @@ -128,7 +140,7 @@ private static string ResolveVariable(this string input, Domain domain, Generato "scale" => transform(domain.Scale?.ToString() ?? string.Empty), "name" => transform(domain.Name ?? string.Empty), "type" => transform(domain.Implementations.GetValueOrDefault(config.Language)?.Type ?? string.Empty), - var i => config.ResolveVariables(config.ResolveGlobalVariables($@"{{{i}}}").Trim('{', '}'), tag: tag) + var i => transform(config.ResolveVariables(config.ResolveGlobalVariables($@"{{{i}}}").Trim('{', '}'), tag: tag)) }; } @@ -174,6 +186,11 @@ private static string ResolveVariable(this string input, IProperty p, string[] p return ResolveVariable(input["domain.".Length..], p.Domain, config, tag); } + if (input.StartsWith($"customProperties.")) + { + return ResolveCustomProperty(input["customProperties.".Length..], p.CustomProperties); + } + if (input.StartsWith("association.")) { var association = p switch @@ -217,7 +234,7 @@ private static string ResolveVariable(this string input, IProperty p, string[] p "resourceKey" => transform(p.ResourceKey.ToString()), "commentResourceKey" => transform(p.CommentResourceKey.ToString()), "defaultValue" => transform(p.DefaultValue?.ToString() ?? string.Empty), - var i => config.ResolveVariables(config.ResolveGlobalVariables($@"{{{i}}}").Trim('{', '}'), module: p.Parent.Namespace.Module, tag: tag) + var i => transform(config.ResolveVariables(config.ResolveGlobalVariables($@"{{{i}}}").Trim('{', '}'), module: p.Parent.Namespace.Module, tag: tag)) }; return result; @@ -255,6 +272,11 @@ private static string ResolveVariable(this string input, Class c, string[] param return ResolveVariable(input["extends.".Length..], c.Extends, parameters, config, tag); } + if (input.StartsWith($"customProperties.")) + { + return ResolveCustomProperty(input["customProperties.".Length..], c.CustomProperties); + } + if (input.StartsWith("properties[")) { var indexSize = input["properties[".Length..].IndexOf("]"); @@ -285,7 +307,7 @@ private static string ResolveVariable(this string input, Class c, string[] param "label" => transform(c.Label ?? string.Empty), "pluralName" => transform(c.PluralName ?? string.Empty), "module" => transform(c.Namespace.Module ?? string.Empty), - var i => config.ResolveVariables(config.ResolveGlobalVariables($@"{{{i}}}").Trim('{', '}'), module: c.Namespace.Module, tag: tag) + var i => transform(config.ResolveVariables(config.ResolveGlobalVariables($@"{{{i}}}").Trim('{', '}'), module: c.Namespace.Module, tag: tag)) }; return result; @@ -313,6 +335,11 @@ private static string ResolveVariable(this string input, Endpoint e, string[] pa return ResolveVariable(input["returns.".Length..], e.Returns, parameters, config, tag); } + if (input.StartsWith($"customProperties.")) + { + return ResolveCustomProperty(input["customProperties.".Length..], e.CustomProperties); + } + if (input.StartsWith("params[")) { var indexSize = input["params[".Length..].IndexOf("]"); diff --git a/docs/generator.md b/docs/generator.md index b1a6733a..a44f66be 100644 --- a/docs/generator.md +++ b/docs/generator.md @@ -50,4 +50,12 @@ Si vous incluez des dépendances autres que `TopModel.Generator.Core` dans votre Enfin, il est indispensable de **build votre projet au préalable** avant de lancer la commande `modgen`. +## Propriétés customs + +Votre module peut avoir besoin d'attributs sur les classes, propriétés ou endpoints qui n'existent pas dans la modélisation standard de TopModel. Pour obtenir des propriétés personnalisées dans le modèle, vous pouvez les ajouter dans l'attributs `customProperties`. Vos générateurs pourront ainsi y accéder dans les objets `Classe`, `Endpoint` ou `IProperty`. Le contenu de customProperties peut être utilisé dans les templates des décorateurs et des domains. + +Les attributs ajoutés à l'ntérieur de `customProperties` ne peuvent pas être des objets. + +Les générateurs standards n'utiliseront **jamais** le contenu de `CustomProperties`. + Bon courage ! diff --git a/docs/model/decorators.md b/docs/model/decorators.md index 455b3b38..848d2102 100644 --- a/docs/model/decorators.md +++ b/docs/model/decorators.md @@ -173,6 +173,7 @@ Actuellement, il est possible d'utiliser ces variables dans une classe : - `label` - `pluralName` - `module` +- `customProperties.*` - `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 - `extends` permet d'accéder à toutes les variables accessibles dans les templates de calsse, pour la classe parente de la classe qui fait l'objet du décorateur @@ -184,6 +185,7 @@ Et ces variables dans un endpoint : - `route` - `method` - `module` +- `customProperties.*` - `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 diff --git a/docs/model/domains.md b/docs/model/domains.md index dfec7613..1469c0f2 100644 --- a/docs/model/domains.md +++ b/docs/model/domains.md @@ -115,6 +115,7 @@ Actuellement il est possible d'utiliser ces variables - `required` - `resourceKey` - `defaultValue` +- `customProperties.*` - `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...)