Add Json source generation
This commit is contained in:
@@ -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>())
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
|
||||
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);
|
||||
foreach (var repository in _repositoryConfiguration.Configuration.Repositories)
|
||||
{
|
||||
Console.WriteLine(repository.Name);
|
||||
}
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private async Task ListModulesByRepoName(string repositoryName)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user