Add Json source generation

This commit is contained in:
2022-11-01 22:04:59 +01:00
parent 1bdebd6f5a
commit a36d306279
10 changed files with 74 additions and 16 deletions

View File

@@ -1,7 +1,16 @@
namespace Alma.Configuration.Module; namespace Alma.Configuration.Module;
public record ModuleConfiguration(string? Target, Dictionary<string, string>? Links) public class ModuleConfiguration
{ {
public string? Target { get; set; }
public Dictionary<string, string>? Links { get; set; }
public ModuleConfiguration(string? target, Dictionary<string, string>? links)
{
Target = target;
Links = links;
}
public ModuleConfiguration Merge(ModuleConfiguration merge) public ModuleConfiguration Merge(ModuleConfiguration merge)
{ {
var mergedLinks = (Links ?? new Dictionary<string, string>()) var mergedLinks = (Links ?? new Dictionary<string, string>())

View File

@@ -1,7 +1,15 @@
namespace Alma.Configuration.Repository; namespace Alma.Configuration.Repository;
public record RepositoryConfigurationEntry( public class RepositoryConfigurationEntry
string Name, {
string? RepositoryPath, public string Name { get; set; }
string? LinkPath public string? RepositoryPath { get; set; }
); public string? LinkPath { get; set; }
public RepositoryConfigurationEntry(string name, string? repositoryPath, string? linkPath)
{
Name = name;
RepositoryPath = repositoryPath;
LinkPath = linkPath;
}
}

View File

@@ -1,3 +1,11 @@
namespace Alma.Configuration.Repository; namespace Alma.Configuration.Repository;
public record RepositoryConfigurationRoot(List<RepositoryConfigurationEntry> Repositories); public record RepositoryConfigurationRoot
{
public List<RepositoryConfigurationEntry> Repositories { get; set; }
public RepositoryConfigurationRoot(List<RepositoryConfigurationEntry> repositories)
{
Repositories = repositories;
}
}

View File

@@ -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
{
}

View File

@@ -1,6 +1,13 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Alma.Services; namespace Alma.Services;
public interface IConfigurationFileReader public interface IConfigurationFileReader
{ {
public Task<(T? Result, string? FileName)> DeserializeAsync<T>(string fileNameWithoutExtension, string? extension = null) where T : class; public Task<(T? Result, string? FileName)> DeserializeAsync<T>(
string fileNameWithoutExtension,
Func<JsonSerializerOptions, JsonSerializerContext> contextGenerator,
string? extension = null)
where T : class;
} }

View File

@@ -30,13 +30,15 @@ public class ListCommand : ICommand
} }
} }
private async Task ListRepositories() private Task ListRepositories()
{ {
Console.WriteLine("Repositories:" + Environment.NewLine); Console.WriteLine("Repositories:" + Environment.NewLine);
foreach (var repository in _repositoryConfiguration.Configuration.Repositories) foreach (var repository in _repositoryConfiguration.Configuration.Repositories)
{ {
Console.WriteLine(repository.Name); Console.WriteLine(repository.Name);
} }
return Task.CompletedTask;
} }
private async Task ListModulesByRepoName(string repositoryName) private async Task ListModulesByRepoName(string repositoryName)
@@ -61,7 +63,7 @@ public class ListCommand : ICommand
{ {
var repositoryDirectory = new DirectoryInfo(repositoryPath); var repositoryDirectory = new DirectoryInfo(repositoryPath);
var moduleDirectories = await TraverseRepositoryFolder(repositoryDirectory); var moduleDirectories = await TraverseRepositoryFolder(repositoryDirectory);
Console.WriteLine($"Modules in repository '{repositoryName}':" + Environment.NewLine); Console.WriteLine($"Modules in repository '{repositoryName}':" + Environment.NewLine);
foreach (var modulePath in moduleDirectories) foreach (var modulePath in moduleDirectories)
{ {

View File

@@ -24,7 +24,7 @@ public class RepositoryConfiguration : IRepositoryConfiguration
} }
var repoConfigFileNameStub = Path.Combine(_folderService.ConfigRoot, "repository"); var repoConfigFileNameStub = Path.Combine(_folderService.ConfigRoot, "repository");
var (configuration, repoConfigFileName) = await _configurationFileReader.DeserializeAsync<RepositoryConfigurationRoot>(repoConfigFileNameStub); var (configuration, repoConfigFileName) = await _configurationFileReader.DeserializeAsync<RepositoryConfigurationRoot>(repoConfigFileNameStub, (o) => new JsonSourceGenerationContext(o));
Configuration = configuration ?? new RepositoryConfigurationRoot(new List<RepositoryConfigurationEntry>()); Configuration = configuration ?? new RepositoryConfigurationRoot(new List<RepositoryConfigurationEntry>());
foreach (var repositoryConfigurationEntry in Configuration.Repositories) foreach (var repositoryConfigurationEntry in Configuration.Repositories)

View File

@@ -1,3 +1,6 @@
using System.Text.Json;
using System.Text.Json.Serialization;
namespace Alma.Services; namespace Alma.Services;
public class ConfigurationFileReader public class ConfigurationFileReader
@@ -9,11 +12,14 @@ public class ConfigurationFileReader
_configurationFileReaders = configurationFileReaders.ToList(); _configurationFileReaders = configurationFileReaders.ToList();
} }
public async Task<(T? Result, string? FileName)> DeserializeAsync<T>(string fileNameWithoutExtension, string? extension = null) where T : class public async Task<(T? Result, string? FileName)> DeserializeAsync<T>(
string fileNameWithoutExtension,
Func<JsonSerializerOptions, JsonSerializerContext> contextGenerator,
string? extension = null) where T : class
{ {
foreach (var configurationFileReader in _configurationFileReaders) foreach (var configurationFileReader in _configurationFileReaders)
{ {
if (await configurationFileReader.DeserializeAsync<T>(fileNameWithoutExtension, extension) is {Result: { }} result) return result; if (await configurationFileReader.DeserializeAsync<T>(fileNameWithoutExtension, contextGenerator, extension) is { Result: { } } result) return result;
} }
return (null, null); return (null, null);

View File

@@ -1,4 +1,5 @@
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization;
namespace Alma.Services; namespace Alma.Services;
@@ -6,13 +7,16 @@ public class JsonConfigurationFileReader : IConfigurationFileReader
{ {
private static readonly JsonSerializerOptions DefaultOptions = new(JsonSerializerDefaults.Web); private static readonly JsonSerializerOptions DefaultOptions = new(JsonSerializerDefaults.Web);
public async Task<(T? Result, string? FileName)> DeserializeAsync<T>(string fileNameWithoutExtension, string? extension) where T : class public async Task<(T? Result, string? FileName)> DeserializeAsync<T>(
string fileNameWithoutExtension,
Func<JsonSerializerOptions, JsonSerializerContext> contextGenerator,
string? extension) where T : class
{ {
extension ??= "json"; extension ??= "json";
var fileName = fileNameWithoutExtension + "." + extension; var fileName = fileNameWithoutExtension + "." + extension;
if (!File.Exists(fileName)) return (null, null); if (!File.Exists(fileName)) return (null, null);
await using FileStream openStream = File.OpenRead(fileName); await using FileStream openStream = File.OpenRead(fileName);
return (await JsonSerializer.DeserializeAsync<T>(openStream, DefaultOptions), fileName); return ((T?)await JsonSerializer.DeserializeAsync(openStream, typeof(T), contextGenerator(DefaultOptions)), fileName);
} }
} }

View File

@@ -17,7 +17,7 @@ public class ModuleConfigurationResolver : IModuleConfigurationResolver
public async Task<(ModuleConfiguration? mergedModuleConfig, string? moduleConfigFileName)> ResolveModuleConfiguration(string moduleConfigStub) public async Task<(ModuleConfiguration? mergedModuleConfig, string? moduleConfigFileName)> ResolveModuleConfiguration(string moduleConfigStub)
{ {
var (moduleConfigRoot, moduleConfigFileName) = await _configurationFileReader.DeserializeAsync<ModuleConfigurationRoot>(moduleConfigStub); (ModuleConfigurationRoot? moduleConfigRoot, string? moduleConfigFileName) = await _configurationFileReader.DeserializeAsync<ModuleConfigurationRoot>(moduleConfigStub, (o )=> new JsonSourceGenerationContext(o));
if (moduleConfigRoot is null) return (null, null); if (moduleConfigRoot is null) return (null, null);