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;
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)
{
var mergedLinks = (Links ?? new Dictionary<string, string>())

View File

@@ -1,7 +1,15 @@
namespace Alma.Configuration.Repository;
public record RepositoryConfigurationEntry(
string Name,
string? RepositoryPath,
string? LinkPath
);
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;
}
}

View File

@@ -1,3 +1,11 @@
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;
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);
foreach (var repository in _repositoryConfiguration.Configuration.Repositories)
{
Console.WriteLine(repository.Name);
}
return Task.CompletedTask;
}
private async Task ListModulesByRepoName(string repositoryName)

View File

@@ -24,7 +24,7 @@ public class RepositoryConfiguration : IRepositoryConfiguration
}
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>());
foreach (var repositoryConfigurationEntry in Configuration.Repositories)

View File

@@ -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<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)
{
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);

View File

@@ -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<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";
var fileName = fileNameWithoutExtension + "." + extension;
if (!File.Exists(fileName)) return (null, null);
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)
{
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);