Skip to content

Commit

Permalink
Merge pull request #393 from klee-contrib/customs-properties-dans-tem…
Browse files Browse the repository at this point in the history
…plates

[Core] Ajout des customs properties dans les templates de propriété, classe et endpoints
  • Loading branch information
JabX authored Sep 19, 2024
2 parents 1447dc8 + 8a094b2 commit e964916
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 3 deletions.
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

0 comments on commit e964916

Please sign in to comment.