Skip to content

Commit 9a1dfea

Browse files
authored
Merge pull request #17 from MORYX-Industry/feature/add-customizable-templates
Add feature of customizable templates
2 parents 8665d21 + 335e975 commit 9a1dfea

37 files changed

+1298
-764
lines changed

src/Moryx.Cli.Commands/Add.cs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,22 @@ public static class Add
1010
{
1111
public static CommandResult Step(AddOptions options)
1212
{
13-
return AddThing(options, (settings) => AddSteps.Exec(settings, options.Name!.ToCleanList()));
13+
return AddThing(options, (template) => AddSteps.Exec(template, options.Name!.ToCleanList()));
1414
}
1515

1616
public static CommandResult Products(AddOptions options)
1717
{
18-
return AddThing(options, (settings) => AddProducts.Exec(settings, options.Name!.ToCleanList()));
18+
return AddThing(options, (template) => AddProducts.Exec(template, options.Name!.ToCleanList()));
1919
}
2020

2121
public static CommandResult Resources(AddOptions options)
2222
{
23-
return AddThing(options, (settings) => AddResources.Exec(settings, options.Name!.ToCleanList()));
23+
return AddThing(options, (template) => AddResources.Exec(template, options.Name!.ToCleanList()));
2424
}
2525

2626
public static CommandResult Module(AddOptions options)
2727
{
28-
return AddThing(options, (settings) => AddModule.Exec(settings, options.Name!));
28+
return AddThing(options, (template) => AddModule.Exec(template, options.Name!));
2929
}
3030

3131
public static CommandResult StateMachine(AddStatesOptions options)
@@ -47,21 +47,20 @@ public static CommandResult StateMachine(AddStatesOptions options)
4747
.Select(x => x.Trim())
4848
.ToList()
4949
?? new List<string>();
50-
return AddThing(addOptions, (settings) => AddStates.Exec(settings, options.ResourceName!, states, transitions));
50+
return AddThing(addOptions, (template) => AddStates.Exec(template, options.ResourceName!, states, transitions));
5151
}
5252

53-
private static CommandResult AddThing(AddOptions options, Func<TemplateSettings, CommandResult> func)
53+
private static CommandResult AddThing(AddOptions options, Func<Template, CommandResult> func)
5454
{
5555
var currentDir = Environment.CurrentDirectory;
56-
var solutionNameError = string.Empty;
57-
var solutionName = Template.GetSolutionName(currentDir, error =>
56+
var errorMessage = string.Empty;
57+
var solutionName = Solution.GetSolutionName(currentDir, error =>
5858
{
59-
Console.WriteLine(error);
60-
solutionNameError = error;
59+
errorMessage = error;
6160
});
6261

6362
if (string.IsNullOrEmpty(solutionName))
64-
return CommandResult.WithError(solutionNameError);
63+
return CommandResult.WithError(errorMessage);
6564

6665
var dir = Path.GetFullPath(currentDir);
6766

@@ -70,7 +69,16 @@ private static CommandResult AddThing(AddOptions options, Func<TemplateSettings,
7069
settings.Branch = options.Branch ?? settings.Branch;
7170
settings.Pull = options.Pull;
7271

73-
return func(settings);
72+
var configuration = TemplateConfigurationFactory.Load(settings.SourceDirectory, error =>
73+
{
74+
errorMessage = error;
75+
});
76+
if (configuration == null)
77+
return CommandResult.WithError(errorMessage);
78+
79+
var template = Template.Load(settings, configuration);
80+
81+
return func(template);
7482
}
7583
}
7684
}
Lines changed: 9 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,26 @@
1-
using Moryx.Cli.Templates;
1+
using Moryx.Cli.Commands.Components;
2+
using Moryx.Cli.Commands.Extensions;
3+
using Moryx.Cli.Templates;
24
using Moryx.Cli.Templates.Models;
3-
using System.Text.RegularExpressions;
45

56
namespace Moryx.Cli.Commands
67
{
78
public static class AddModule
89
{
9-
public static CommandResult Exec(TemplateSettings settings, string moduleName)
10+
public static CommandResult Exec(Template template, string moduleName)
1011
{
11-
return CommandBase.Exec(settings, (filenames) =>
12+
return CommandBase.Exec(template, () =>
1213
AddThing.Exec(
13-
settings,
14+
template,
1415
new AddConfig
1516
{
16-
SolutionName = settings.AppName,
17+
SolutionName = template.AppName,
1718
ThingName = moduleName,
1819
Thing = "module",
19-
ThingPlaceholders = [Template.ModulePlaceholder],
2020
},
21-
filenames.Module(),
22-
s => AddProjectsToSolution(settings, s)
21+
template.Module(moduleName),
22+
s => s.AddProjectsToSolution(template.Settings)
2323
));
2424
}
25-
26-
private static void AddProjectsToSolution(TemplateSettings settings, IEnumerable<string> fileNames)
27-
{
28-
var projectFiles = fileNames
29-
.Where(f => f.EndsWith(".csproj"))
30-
.ToList();
31-
var solutionFilename = Path.Combine(settings.TargetDirectory, $"{settings.AppName}.sln");
32-
var rootGuid = GetRootGuid(solutionFilename);
33-
if(projectFiles.Any())
34-
{
35-
36-
foreach (var file in projectFiles)
37-
{
38-
var filename = Path.GetFileNameWithoutExtension(file);
39-
var relativePath = Path.GetRelativePath(settings.TargetDirectory, file);
40-
var str = $"Project(\"{rootGuid}\") = \"{filename}\", \"{relativePath}\", \"{{{Guid.NewGuid()}}}\"\r\nEndProject\r\n";
41-
using var fileWriter = File.AppendText(solutionFilename);
42-
fileWriter.Write(str);
43-
}
44-
}
45-
}
46-
47-
private static string GetRootGuid(string solutionFilename)
48-
{
49-
var lines = File.ReadAllText(Path.Combine(solutionFilename));
50-
if (lines.Any())
51-
{
52-
var match = Regex.Match(lines, @"Project.+(\{.+\}).+App");
53-
return match.Groups[1].Value;
54-
}
55-
return "";
56-
}
5725
}
5826
}

src/Moryx.Cli.Commands/AddProducts.cs

Lines changed: 10 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Moryx.Cli.Templates;
2+
using Moryx.Cli.Templates.Extensions;
23
using Moryx.Cli.Templates.Models;
34
using Moryx.Products.Management;
45
using Moryx.Runtime.Kernel;
@@ -7,39 +8,30 @@ namespace Moryx.Cli.Commands
78
{
89
public class AddProducts
910
{
10-
public static CommandResult Exec(TemplateSettings settings, IEnumerable<string> products)
11+
public static CommandResult Exec(Template template, IEnumerable<string> products)
1112
{
12-
return CommandBase.Exec(settings, (filenames) =>
13+
return CommandBase.Exec(template, () =>
1314
{
14-
return Add(settings, filenames, products);
15+
return Add(template, products);
1516
});
1617
}
1718

18-
private static CommandResult Add(TemplateSettings settings, List<string> cleanedResourceNames, IEnumerable<string> products)
19+
private static CommandResult Add(Template template, IEnumerable<string> products)
1920
{
20-
var projectFilenames = cleanedResourceNames.InitialProjects();
21-
var filteredResourceNames = cleanedResourceNames.Product();
22-
2321
var msg = new List<string>();
2422
foreach (var product in products)
2523
{
2624
try
2725
{
28-
var dictionary = Template.PrepareFileStructure(settings.AppName, filteredResourceNames, projectFilenames);
26+
var dictionary = template.Product(product);
2927

30-
var files = Template.WriteFilesToDisk(
31-
dictionary,
32-
settings,
33-
s => s.ReplaceProductName(product));
28+
var files = template.WriteFilesToDisk(dictionary);
3429
Template.ReplacePlaceHoldersInsideFiles(
3530
files,
36-
new Dictionary<string, string>
37-
{
38-
{ Template.AppPlaceholder, settings.AppName },
39-
{ Template.ProductPlaceholder, product },
40-
});
31+
template.ReplaceVariables(template.Configuration.Add.Product, product)
32+
);
4133

42-
UpdateProductConfig(settings, product);
34+
UpdateProductConfig(template.Settings, product);
4335

4436
msg.Add($"Successfully added {product} product");
4537
}

src/Moryx.Cli.Commands/AddResources.cs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,21 @@ namespace Moryx.Cli.Commands
66
{
77
public static class AddResources
88
{
9-
public static CommandResult Exec(TemplateSettings settings, IEnumerable<string> resources)
9+
public static CommandResult Exec(Template template, IEnumerable<string> resources)
1010
{
11-
return CommandBase.Exec(settings, (filenames)
11+
return CommandBase.Exec(template, ()
1212
=> resources.Select(resource =>
1313
{
1414
var addConfig = new AddConfig
1515
{
16-
SolutionName = settings.AppName,
16+
SolutionName = template.AppName,
1717
ThingName = $"{resource}Resource",
1818
Thing = "resource",
19-
ThingPlaceholders =
20-
[
21-
Template.ResourcePlaceholder,
22-
Template.ResourcePlaceholder2
23-
],
2419
};
2520
return AddThing.Exec(
26-
settings,
21+
template,
2722
addConfig,
28-
filenames.Resource()
23+
template.Resource(resource)
2924
);
3025
})
3126
.ToArray()

src/Moryx.Cli.Commands/AddStates.cs

Lines changed: 22 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@
22
using Moryx.Cli.Templates.Models;
33
using Moryx.Cli.Commands.Extensions;
44
using Moryx.Cli.Templates.StateBaseTemplate;
5-
using Moryx.Cli.Templates.Exceptions;
65
using Moryx.Cli.Templates.StateTemplate;
76
using Moryx.Cli.Templates.Components;
8-
using Moryx.AbstractionLayer.Resources;
97

108
namespace Moryx.Cli.Commands
119
{
@@ -14,42 +12,35 @@ internal class AddStates
1412
const string StateBase = "StateBase";
1513
const string SpecificState = "SpecificState";
1614

17-
internal static CommandResult Exec(TemplateSettings settings, string resource, IEnumerable<string> states, List<string> transitions)
15+
internal static CommandResult Exec(Template template, string resource, IEnumerable<string> states, List<string> transitions)
1816
{
19-
return CommandBase.Exec(settings, (fileNames) => Add(settings, fileNames, resource, states));
17+
return CommandBase.Exec(template, () => Add(template, resource, states));
2018
}
2119

22-
private static CommandResult Add(TemplateSettings settings, List<string> cleanedResourceNames, string resource, IEnumerable<string> states)
20+
private static CommandResult Add(Template template, string resource, IEnumerable<string> states)
2321
{
24-
var resourceFile = FindResource(settings, resource);
22+
var resourceFile = FindResource(template.Settings, resource);
2523
if (string.IsNullOrEmpty(resourceFile))
2624
{
2725
return CommandResult.WithError($"`{resource}` not found. Make sure that a type `{resource}` exists in the project.");
2826
}
2927

30-
var projectFileNames = cleanedResourceNames.InitialProjects();
31-
var stateBaseFileName = cleanedResourceNames.StateBaseFile();
3228

33-
var dictionary = Template.PrepareFileStructure(settings.AppName, stateBaseFileName, projectFileNames);
29+
var dictionary = template.StateBaseFile(resource);
3430
var targetPath = Path.Combine(Path.GetDirectoryName(resourceFile)!, "States");
35-
var newStateBaseFileName = Path.Combine(targetPath, $"{resource}StateBase.cs");
31+
var newStateBaseFileName = Path.Combine(
32+
targetPath,
33+
Path.GetFileName(dictionary.FirstOrDefault().Value));
34+
35+
dictionary = new Dictionary<string, string> { { dictionary.FirstOrDefault().Key, newStateBaseFileName } };
3636

3737
if (!File.Exists(newStateBaseFileName))
3838
{
39-
var files = Template.WriteFilesToDisk(
40-
dictionary,
41-
settings,
42-
_ => newStateBaseFileName);
39+
var files = template.WriteFilesToDisk(dictionary);
4340

4441
Template.ReplacePlaceHoldersInsideFiles(
4542
files,
46-
new Dictionary<string, string>
47-
{
48-
{ Template.AppPlaceholder, settings.AppName },
49-
{ Template.StateBasePlaceholder, $"{resource}StateBase" },
50-
{ Template.CellPlaceholder, $"{resource}" },
51-
{ Template.ResourcePlaceholder, resource },
52-
});
43+
template.Configuration.Add.StateBase.Replacements);
5344

5445
if (!states.Any())
5546
{
@@ -78,27 +69,22 @@ private static CommandResult Add(TemplateSettings settings, List<string> cleaned
7869

7970
try
8071
{
81-
var stateFileName = cleanedResourceNames.StateFile();
72+
var stateFiles = template.StateFile(state, resource);
73+
stateFiles = stateFiles
74+
.ToDictionary(
75+
file => file.Key,
76+
file => Path.Combine(targetPath, $"{stateType}.cs")
77+
);
78+
8279

83-
dictionary = Template.PrepareFileStructure(settings.AppName, stateFileName, projectFileNames);
8480
var filename = Path.Combine(targetPath, $"{stateType}.cs");
8581
if (!File.Exists(filename))
8682
{
87-
var files = Template.WriteFilesToDisk(
88-
dictionary,
89-
settings,
90-
_ => filename);
83+
var files = template.WriteFilesToDisk(stateFiles);
9184

9285
Template.ReplacePlaceHoldersInsideFiles(
9386
files,
94-
new Dictionary<string, string>
95-
{
96-
{ Template.AppPlaceholder, settings.AppName },
97-
{ Template.StatePlaceholder, stateType },
98-
{ Template.ResourcePlaceholder, resource },
99-
{ Template.CellPlaceholder, resource },
100-
{ Template.StateBasePlaceholder, $"{resource}StateBase" },
101-
});
87+
template.Configuration.Add.State.Replacements);
10288

10389
stateBaseTemplate = stateBaseTemplate.AddState(stateType);
10490

@@ -118,7 +104,7 @@ private static CommandResult Add(TemplateSettings settings, List<string> cleaned
118104
stateBaseTemplate.SaveToFile(newStateBaseFileName);
119105

120106
UpdateResource(
121-
settings,
107+
template.Settings,
122108
resource,
123109
success => msg.Add(success),
124110
warning => warnings.Add(warning));

0 commit comments

Comments
 (0)