Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Core] Ajout des customs properties dans les templates de propriété, classe et endpoints #393

Merged
merged 1 commit into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 30 additions & 3 deletions TopModel.Generator.Core/TemplateExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,18 @@ private static IEnumerable<Match> ExtractVariables(this string input)
return regex.Matches(input).Cast<Match>();
}

private static string ResolveCustomProperty(string input, Dictionary<string, string> 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();
Expand All @@ -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))
};
}

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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("]");
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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("]");
Expand Down
8 changes: 8 additions & 0 deletions docs/generator.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 !
2 changes: 2 additions & 0 deletions docs/model/decorators.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down
1 change: 1 addition & 0 deletions docs/model/domains.md
Original file line number Diff line number Diff line change
Expand Up @@ -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...)

Expand Down
Loading