From a36d306279dd7cdfcde1460bd4af371647b5f6b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81d=C3=A1m=20Kov=C3=A1cs?= Date: Tue, 1 Nov 2022 22:04:59 +0100 Subject: [PATCH] Add Json source generation --- .../Module/ModuleConfiguration.cs | 11 ++++++++++- .../Repository/RepositoryConfigurationEntry.cs | 18 +++++++++++++----- .../Repository/RepositoryConfigurationRoot.cs | 10 +++++++++- .../JsonSourceGenerationContext.cs | 14 ++++++++++++++ .../Services/IConfigurationFileReader.cs | 9 ++++++++- src/Alma.App/Command/List/ListCommand.cs | 6 ++++-- .../Repository/RepositoryConfiguration.cs | 2 +- .../Services/ConfigurationFileReader.cs | 10 ++++++++-- .../Services/JsonConfigurationFileReader.cs | 8 ++++++-- .../Services/ModuleConfigurationResolver.cs | 2 +- 10 files changed, 74 insertions(+), 16 deletions(-) create mode 100644 src/Alma.Abstraction/JsonSourceGenerationContext.cs diff --git a/src/Alma.Abstraction/Configuration/Module/ModuleConfiguration.cs b/src/Alma.Abstraction/Configuration/Module/ModuleConfiguration.cs index b8e9fbc..9c9c963 100644 --- a/src/Alma.Abstraction/Configuration/Module/ModuleConfiguration.cs +++ b/src/Alma.Abstraction/Configuration/Module/ModuleConfiguration.cs @@ -1,7 +1,16 @@ namespace Alma.Configuration.Module; -public record ModuleConfiguration(string? Target, Dictionary? Links) +public class ModuleConfiguration { + public string? Target { get; set; } + public Dictionary? Links { get; set; } + + public ModuleConfiguration(string? target, Dictionary? links) + { + Target = target; + Links = links; + } + public ModuleConfiguration Merge(ModuleConfiguration merge) { var mergedLinks = (Links ?? new Dictionary()) diff --git a/src/Alma.Abstraction/Configuration/Repository/RepositoryConfigurationEntry.cs b/src/Alma.Abstraction/Configuration/Repository/RepositoryConfigurationEntry.cs index 93bf6b7..490daea 100644 --- a/src/Alma.Abstraction/Configuration/Repository/RepositoryConfigurationEntry.cs +++ b/src/Alma.Abstraction/Configuration/Repository/RepositoryConfigurationEntry.cs @@ -1,7 +1,15 @@ namespace Alma.Configuration.Repository; -public record RepositoryConfigurationEntry( - string Name, - string? RepositoryPath, - string? LinkPath -); \ No newline at end of file +public class RepositoryConfigurationEntry +{ + public string Name { get; set; } + public string? RepositoryPath { get; set; } + public string? LinkPath { get; set; } + + public RepositoryConfigurationEntry(string name, string? repositoryPath, string? linkPath) + { + Name = name; + RepositoryPath = repositoryPath; + LinkPath = linkPath; + } +} \ No newline at end of file diff --git a/src/Alma.Abstraction/Configuration/Repository/RepositoryConfigurationRoot.cs b/src/Alma.Abstraction/Configuration/Repository/RepositoryConfigurationRoot.cs index 5f4fdb8..bfe5d9f 100644 --- a/src/Alma.Abstraction/Configuration/Repository/RepositoryConfigurationRoot.cs +++ b/src/Alma.Abstraction/Configuration/Repository/RepositoryConfigurationRoot.cs @@ -1,3 +1,11 @@ namespace Alma.Configuration.Repository; -public record RepositoryConfigurationRoot(List Repositories); \ No newline at end of file +public record RepositoryConfigurationRoot +{ + public List Repositories { get; set; } + + public RepositoryConfigurationRoot(List repositories) + { + Repositories = repositories; + } +} \ No newline at end of file diff --git a/src/Alma.Abstraction/JsonSourceGenerationContext.cs b/src/Alma.Abstraction/JsonSourceGenerationContext.cs new file mode 100644 index 0000000..f270a71 --- /dev/null +++ b/src/Alma.Abstraction/JsonSourceGenerationContext.cs @@ -0,0 +1,14 @@ +using System.Text.Json.Serialization; +using Alma.Configuration.Module; +using Alma.Configuration.Repository; + +namespace Alma; + +[JsonSourceGenerationOptions(WriteIndented = true)] +[JsonSerializable(typeof(ModuleConfigurationRoot))] +[JsonSerializable(typeof(ModuleConfiguration))] +[JsonSerializable(typeof(RepositoryConfigurationEntry))] +[JsonSerializable(typeof(RepositoryConfigurationRoot))] +public partial class JsonSourceGenerationContext : JsonSerializerContext +{ +} diff --git a/src/Alma.Abstraction/Services/IConfigurationFileReader.cs b/src/Alma.Abstraction/Services/IConfigurationFileReader.cs index 5be72d5..d11f41b 100644 --- a/src/Alma.Abstraction/Services/IConfigurationFileReader.cs +++ b/src/Alma.Abstraction/Services/IConfigurationFileReader.cs @@ -1,6 +1,13 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + namespace Alma.Services; public interface IConfigurationFileReader { - public Task<(T? Result, string? FileName)> DeserializeAsync(string fileNameWithoutExtension, string? extension = null) where T : class; + public Task<(T? Result, string? FileName)> DeserializeAsync( + string fileNameWithoutExtension, + Func contextGenerator, + string? extension = null) + where T : class; } \ No newline at end of file diff --git a/src/Alma.App/Command/List/ListCommand.cs b/src/Alma.App/Command/List/ListCommand.cs index acc845a..97384a2 100644 --- a/src/Alma.App/Command/List/ListCommand.cs +++ b/src/Alma.App/Command/List/ListCommand.cs @@ -30,13 +30,15 @@ public class ListCommand : ICommand } } - private async Task ListRepositories() + private Task ListRepositories() { Console.WriteLine("Repositories:" + Environment.NewLine); foreach (var repository in _repositoryConfiguration.Configuration.Repositories) { Console.WriteLine(repository.Name); } + + return Task.CompletedTask; } private async Task ListModulesByRepoName(string repositoryName) @@ -61,7 +63,7 @@ public class ListCommand : ICommand { var repositoryDirectory = new DirectoryInfo(repositoryPath); var moduleDirectories = await TraverseRepositoryFolder(repositoryDirectory); - + Console.WriteLine($"Modules in repository '{repositoryName}':" + Environment.NewLine); foreach (var modulePath in moduleDirectories) { diff --git a/src/Alma.App/Configuration/Repository/RepositoryConfiguration.cs b/src/Alma.App/Configuration/Repository/RepositoryConfiguration.cs index c6b29db..4ff2559 100644 --- a/src/Alma.App/Configuration/Repository/RepositoryConfiguration.cs +++ b/src/Alma.App/Configuration/Repository/RepositoryConfiguration.cs @@ -24,7 +24,7 @@ public class RepositoryConfiguration : IRepositoryConfiguration } var repoConfigFileNameStub = Path.Combine(_folderService.ConfigRoot, "repository"); - var (configuration, repoConfigFileName) = await _configurationFileReader.DeserializeAsync(repoConfigFileNameStub); + var (configuration, repoConfigFileName) = await _configurationFileReader.DeserializeAsync(repoConfigFileNameStub, (o) => new JsonSourceGenerationContext(o)); Configuration = configuration ?? new RepositoryConfigurationRoot(new List()); foreach (var repositoryConfigurationEntry in Configuration.Repositories) diff --git a/src/Alma.App/Services/ConfigurationFileReader.cs b/src/Alma.App/Services/ConfigurationFileReader.cs index 100fd41..08e23bf 100644 --- a/src/Alma.App/Services/ConfigurationFileReader.cs +++ b/src/Alma.App/Services/ConfigurationFileReader.cs @@ -1,3 +1,6 @@ +using System.Text.Json; +using System.Text.Json.Serialization; + namespace Alma.Services; public class ConfigurationFileReader @@ -9,11 +12,14 @@ public class ConfigurationFileReader _configurationFileReaders = configurationFileReaders.ToList(); } - public async Task<(T? Result, string? FileName)> DeserializeAsync(string fileNameWithoutExtension, string? extension = null) where T : class + public async Task<(T? Result, string? FileName)> DeserializeAsync( + string fileNameWithoutExtension, + Func contextGenerator, + string? extension = null) where T : class { foreach (var configurationFileReader in _configurationFileReaders) { - if (await configurationFileReader.DeserializeAsync(fileNameWithoutExtension, extension) is {Result: { }} result) return result; + if (await configurationFileReader.DeserializeAsync(fileNameWithoutExtension, contextGenerator, extension) is { Result: { } } result) return result; } return (null, null); diff --git a/src/Alma.App/Services/JsonConfigurationFileReader.cs b/src/Alma.App/Services/JsonConfigurationFileReader.cs index 10d8a88..30955c0 100644 --- a/src/Alma.App/Services/JsonConfigurationFileReader.cs +++ b/src/Alma.App/Services/JsonConfigurationFileReader.cs @@ -1,4 +1,5 @@ using System.Text.Json; +using System.Text.Json.Serialization; namespace Alma.Services; @@ -6,13 +7,16 @@ public class JsonConfigurationFileReader : IConfigurationFileReader { private static readonly JsonSerializerOptions DefaultOptions = new(JsonSerializerDefaults.Web); - public async Task<(T? Result, string? FileName)> DeserializeAsync(string fileNameWithoutExtension, string? extension) where T : class + public async Task<(T? Result, string? FileName)> DeserializeAsync( + string fileNameWithoutExtension, + Func contextGenerator, + string? extension) where T : class { extension ??= "json"; var fileName = fileNameWithoutExtension + "." + extension; if (!File.Exists(fileName)) return (null, null); await using FileStream openStream = File.OpenRead(fileName); - return (await JsonSerializer.DeserializeAsync(openStream, DefaultOptions), fileName); + return ((T?)await JsonSerializer.DeserializeAsync(openStream, typeof(T), contextGenerator(DefaultOptions)), fileName); } } \ No newline at end of file diff --git a/src/Alma.App/Services/ModuleConfigurationResolver.cs b/src/Alma.App/Services/ModuleConfigurationResolver.cs index 265f035..ac7bd66 100644 --- a/src/Alma.App/Services/ModuleConfigurationResolver.cs +++ b/src/Alma.App/Services/ModuleConfigurationResolver.cs @@ -17,7 +17,7 @@ public class ModuleConfigurationResolver : IModuleConfigurationResolver public async Task<(ModuleConfiguration? mergedModuleConfig, string? moduleConfigFileName)> ResolveModuleConfiguration(string moduleConfigStub) { - var (moduleConfigRoot, moduleConfigFileName) = await _configurationFileReader.DeserializeAsync(moduleConfigStub); + (ModuleConfigurationRoot? moduleConfigRoot, string? moduleConfigFileName) = await _configurationFileReader.DeserializeAsync(moduleConfigStub, (o )=> new JsonSourceGenerationContext(o)); if (moduleConfigRoot is null) return (null, null);