Add Json source generation
This commit is contained in:
@@ -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>())
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
14
src/Alma.Abstraction/JsonSourceGenerationContext.cs
Normal file
14
src/Alma.Abstraction/JsonSourceGenerationContext.cs
Normal 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
|
||||||
|
{
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
}
|
}
|
||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user