Skip to content

Commit

Permalink
Use yaml static context, use dictionary for app config
Browse files Browse the repository at this point in the history
  • Loading branch information
Fleny113 committed Jul 3, 2024
1 parent 7af2f26 commit 7849226
Show file tree
Hide file tree
Showing 7 changed files with 57 additions and 31 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
using Hexus.Daemon.Configuration;
using Hexus.Daemon.Contracts;
using Hexus.Daemon.Contracts.Requests;
using Hexus.Daemon.Contracts.Responses;
using System.Text.Json.Serialization;
using YamlDotNet.Serialization;

namespace Hexus.Daemon;

Expand All @@ -14,3 +16,8 @@ namespace Hexus.Daemon;
[JsonSerializable(typeof(SendInputRequest))]
[JsonSourceGenerationOptions(UseStringEnumConverter = true)]
internal partial class AppJsonSerializerContext : JsonSerializerContext;

[YamlSerializable(typeof(HexusConfigurationFile))]
[YamlSerializable(typeof(HexusApplication))]
[YamlStaticContext]
public partial class AppYamlSerializerContext : StaticContext;
13 changes: 7 additions & 6 deletions Hexus.Daemon/Configuration/HexusApplication.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
using System.ComponentModel;
using YamlDotNet.Serialization;

namespace Hexus.Daemon.Configuration;

public sealed record HexusApplication
{
public required string Name { get; set; }
public required string Executable { get; set; }
[YamlIgnore]
public string Name { get; set; } = null!;
public string Executable { get; set; } = null!;

[DefaultValue("")] public string Arguments { get; set; } = "";
public string WorkingDirectory { get; set; } = "";
public string? Arguments { get; set; }
public string WorkingDirectory { get; set; } = null!;
public HexusApplicationStatus Status { get; set; } = HexusApplicationStatus.Exited;
[DefaultValue("")] public string Note { get; set; } = "";
public string? Note { get; set; }

public Dictionary<string, string> EnvironmentVariables { get; set; } = [];
}
21 changes: 7 additions & 14 deletions Hexus.Daemon/Configuration/HexusConfiguration.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
using System.ComponentModel;
namespace Hexus.Daemon.Configuration;

namespace Hexus.Daemon.Configuration;

/// <summary>
/// Object used to consume the config file
/// </summary>
public sealed record HexusConfiguration
{
public required string UnixSocket { get; init; }
Expand All @@ -13,13 +8,11 @@ public sealed record HexusConfiguration
public Dictionary<string, HexusApplication> Applications { get; init; } = [];
}

/// <summary>
/// Object used to write to the config file
/// </summary>
public sealed record HexusConfigurationFile
// Used for the YAML File serialization
internal sealed record HexusConfigurationFile
{
public string? UnixSocket { get; init; }
public int? HttpPort { get; init; }
public double? CpuRefreshIntervalSeconds { get; init; }
public IEnumerable<HexusApplication>? Applications { get; init; }
public string? UnixSocket { get; set; }
public int? HttpPort { get; set; }
public double? CpuRefreshIntervalSeconds { get; set; }
public Dictionary<string, HexusApplication>? Applications { get; set; }
}
14 changes: 7 additions & 7 deletions Hexus.Daemon/Configuration/HexusConfigurationManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ internal class HexusConfigurationManager
{
public HexusConfiguration Configuration { get; private set; } = null!;

private static readonly IDeserializer YamlDeserializer = new DeserializerBuilder()
private static readonly AppYamlSerializerContext _yamlStaticContext = new();
private static readonly IDeserializer _yamlDeserializer = new StaticDeserializerBuilder(_yamlStaticContext)
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.Build();

private static readonly ISerializer YamlSerializer = new SerializerBuilder()
.ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitNull | DefaultValuesHandling.OmitDefaults)
.WithIndentedSequences()
private static readonly ISerializer _yamlSerializer = new StaticSerializerBuilder(_yamlStaticContext)
.ConfigureDefaultValuesHandling(DefaultValuesHandling.OmitNull | DefaultValuesHandling.OmitDefaults | DefaultValuesHandling.OmitEmptyCollections)
.WithNamingConvention(CamelCaseNamingConvention.Instance)
.WithIndentedSequences()
.Build();

private void LoadConfiguration()
Expand All @@ -31,7 +31,7 @@ private void LoadConfiguration()
}

var configurationFile = File.ReadAllText(EnvironmentHelper.ConfigurationFile);
var configFile = YamlDeserializer.Deserialize<HexusConfigurationFile?>(configurationFile) ?? new HexusConfigurationFile();
var configFile = _yamlDeserializer.Deserialize<HexusConfigurationFile?>(configurationFile) ?? new HexusConfigurationFile();

Configuration = configFile.MapToConfig();

Expand All @@ -42,7 +42,7 @@ internal void SaveConfiguration()
{
EnvironmentHelper.EnsureDirectoriesExistence();

var yamlString = YamlSerializer.Serialize(Configuration.MapToConfigFile());
var yamlString = _yamlSerializer.Serialize(Configuration.MapToConfigFile());

lock (this)
{
Expand Down
4 changes: 2 additions & 2 deletions Hexus.Daemon/Contracts/Responses/ApplicationResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ namespace Hexus.Daemon.Contracts.Responses;
public sealed record ApplicationResponse(
string Name,
string Executable,
string Arguments,
string? Arguments,
string WorkingDirectory,
string Note,
string? Note,
Dictionary<string, string> EnvironmentVariables,
HexusApplicationStatus Status,
TimeSpan ProcessUptime,
Expand Down
28 changes: 26 additions & 2 deletions Hexus.Daemon/Extensions/MapperExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Hexus.Daemon.Contracts.Requests;
using Hexus.Daemon.Contracts.Responses;
using Hexus.Daemon.Services;
using Microsoft.Extensions.Configuration;

namespace Hexus.Daemon.Extensions;

Expand Down Expand Up @@ -46,12 +47,23 @@ public static ApplicationResponse MapToResponse(this HexusApplication applicatio

public static HexusConfiguration MapToConfig(this HexusConfigurationFile configurationFile)
{
var applications = configurationFile.Applications?.Select(x => new KeyValuePair<string, HexusApplication>(x.Key, new()
{
Name = x.Key,
Executable = x.Value.Executable,
Arguments = x.Value.Arguments,
WorkingDirectory = x.Value.WorkingDirectory,
Status = x.Value.Status,
Note = x.Value.Note,
EnvironmentVariables = x.Value.EnvironmentVariables
}));

return new()
{
UnixSocket = configurationFile.UnixSocket ?? EnvironmentHelper.SocketFile,
HttpPort = configurationFile.HttpPort,
CpuRefreshIntervalSeconds = configurationFile.CpuRefreshIntervalSeconds ?? 2.5,
Applications = configurationFile.Applications?.ToDictionary(application => application.Name) ?? [],
Applications = applications?.ToDictionary() ?? [],
};
}
public static HexusConfigurationFile MapToConfigFile(this HexusConfiguration configuration)
Expand All @@ -60,12 +72,24 @@ public static HexusConfigurationFile MapToConfigFile(this HexusConfiguration con
var socket = configuration.UnixSocket != EnvironmentHelper.SocketFile ? configuration.UnixSocket : null;
var cpuRefresh = configuration.CpuRefreshIntervalSeconds != 2.5 ? configuration.CpuRefreshIntervalSeconds : (double?)null;

var applications = configuration.Applications.Select(x => new KeyValuePair<string, HexusApplication>(x.Key, new()
{
// We don't want to serialize the name in the config file
Name = null!,
Executable = x.Value.Executable,
Arguments = x.Value.Arguments,
WorkingDirectory = x.Value.WorkingDirectory,
Status = x.Value.Status,
Note = x.Value.Note,
EnvironmentVariables = x.Value.EnvironmentVariables
}));

return new()
{
UnixSocket = socket,
HttpPort = configuration.HttpPort,
CpuRefreshIntervalSeconds = cpuRefresh,
Applications = configuration.Applications.Values,
Applications = applications.ToDictionary(),
};
}
}
1 change: 1 addition & 0 deletions Hexus.Daemon/Hexus.Daemon.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
<PackageReference Include="Microsoft.Extensions.Hosting.Systemd" Version="8.0.0" />
<PackageReference Include="NReco.Logging.File" Version="1.2.1" />
<PackageReference Include="System.Linq.Async" Version="6.0.1" />
<PackageReference Include="Vecc.YamlDotNet.Analyzers.StaticGenerator" Version="15.1.2" />
<PackageReference Include="YamlDotNet" Version="15.3.0" />

<InternalsVisibleTo Include="Hexus" />
Expand Down

0 comments on commit 7849226

Please sign in to comment.