Skip to content

Commit

Permalink
make code generation logic injectable (#360)
Browse files Browse the repository at this point in the history
Co-authored-by: Tomas Hellström <tomas.hellstrom@yahoo.se>
  • Loading branch information
makp0 and helto4real committed May 2, 2021
1 parent 116c976 commit c6256f7
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 15 deletions.
2 changes: 2 additions & 0 deletions src/DaemonRunner/DaemonRunner/NetDaemonExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ public static IHostBuilder UseNetDaemon(this IHostBuilder hostBuilder)
services.Configure<HomeAssistantSettings>(context.Configuration.GetSection("HomeAssistant"));
services.Configure<NetDaemonSettings>(context.Configuration.GetSection("NetDaemon"));
services.AddSingleton<IYamlConfig, YamlConfig>();
services.AddSingleton<ICodeGenerationHandler, CodeGenerationHandler>();
services.AddSingleton<ICodeGenerator, CodeGenerator>();
RegisterNetDaemonAssembly(services);
})
Expand Down
33 changes: 33 additions & 0 deletions src/DaemonRunner/DaemonRunner/Service/App/CodeGenerationHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using NetDaemon.Daemon;

namespace NetDaemon.Service.App
{
public class CodeGenerationHandler : ICodeGenerationHandler
{
private readonly ICodeGenerator _codeGenerator;

public CodeGenerationHandler(ICodeGenerator codeGenerator)
{
_codeGenerator = codeGenerator;
}

public async Task GenerateEntitiesAsync(NetDaemonHost daemonHost, string sourceFolder)
{
if (daemonHost == null) throw new ArgumentNullException(nameof(daemonHost));
if (sourceFolder == null) throw new ArgumentNullException(nameof(sourceFolder));

var services = await daemonHost.GetAllServices().ConfigureAwait(false);
var sourceRx = _codeGenerator.GenerateCodeRx(
"NetDaemon.Generated.Reactive",
daemonHost.State.Select(n => n.EntityId).Distinct(),
services
);

await File.WriteAllTextAsync(Path.Combine(sourceFolder, "_EntityExtensionsRx.cs.gen"), sourceRx).ConfigureAwait(false);
}
}
}
4 changes: 2 additions & 2 deletions src/DaemonRunner/DaemonRunner/Service/App/CodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

namespace NetDaemon.Service.App
{
public static class CodeGenerator
public class CodeGenerator : ICodeGenerator
{
private static readonly Dictionary<string, string[]> _skipDomainServices = new Dictionary<string, string[]>()
{
Expand Down Expand Up @@ -89,7 +89,7 @@ public static class CodeGenerator
}
};

public static string? GenerateCodeRx(string nameSpace, IEnumerable<string> entities,
public string? GenerateCodeRx(string nameSpace, IEnumerable<string> entities,
IEnumerable<HassServiceDomain> services)
{
var code = SyntaxFactory.CompilationUnit();
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System.Threading.Tasks;
using NetDaemon.Daemon;

namespace NetDaemon.Service
{
public interface ICodeGenerationHandler
{
Task GenerateEntitiesAsync(NetDaemonHost daemonHost, string sourceFolder);
}
}
10 changes: 10 additions & 0 deletions src/DaemonRunner/DaemonRunner/Service/App/ICodeGenerator.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using System.Collections.Generic;
using JoySoftware.HomeAssistant.Client;

namespace NetDaemon.Service.App
{
public interface ICodeGenerator
{
string? GenerateCodeRx(string nameSpace, IEnumerable<string> entities, IEnumerable<HassServiceDomain> services);
}
}
22 changes: 9 additions & 13 deletions src/DaemonRunner/DaemonRunner/Service/RunnerService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ public class RunnerService : BackgroundService
private readonly IServiceProvider _serviceProvider;
private readonly IYamlConfig _yamlConfig;
private readonly IDaemonAppCompiler _daemonAppCompiler;
private readonly ICodeGenerationHandler _codeGenerationHandler;

private bool _entitiesGenerated;
private IEnumerable<Type>? _loadedDaemonApps;
Expand All @@ -47,8 +48,8 @@ public class RunnerService : BackgroundService
IOptions<HomeAssistantSettings> homeAssistantSettings,
IServiceProvider serviceProvider,
IYamlConfig yamlConfig,
IDaemonAppCompiler daemonAppCompiler
)
IDaemonAppCompiler daemonAppCompiler,
ICodeGenerationHandler codeGenerationHandler)
{
_ = homeAssistantSettings ??
throw new NetDaemonArgumentNullException(nameof(homeAssistantSettings));
Expand All @@ -60,6 +61,7 @@ IDaemonAppCompiler daemonAppCompiler
_serviceProvider = serviceProvider;
_yamlConfig = yamlConfig;
_daemonAppCompiler = daemonAppCompiler;
_codeGenerationHandler = codeGenerationHandler;
}

public override async Task StopAsync(CancellationToken cancellationToken)
Expand Down Expand Up @@ -147,7 +149,7 @@ private async Task Run(NetDaemonHost daemonHost, CancellationToken stoppingToken
{
// Generate code if requested
if (_sourcePath is string)
await GenerateEntities(daemonHost, _sourcePath).ConfigureAwait(false);
await GenerateEntitiesAsync(daemonHost, _sourcePath).ConfigureAwait(false);

if (_loadedDaemonApps is null)
_loadedDaemonApps = _daemonAppCompiler.GetApps();
Expand Down Expand Up @@ -208,7 +210,8 @@ private async Task Run(NetDaemonHost daemonHost, CancellationToken stoppingToken
_hasConnectedBefore = true;
}
}
private async Task GenerateEntities(NetDaemonHost daemonHost, string sourceFolder)

public async Task GenerateEntitiesAsync(NetDaemonHost daemonHost, string sourceFolder)
{
if (!_netDaemonSettings.GenerateEntities.GetValueOrDefault())
return;
Expand All @@ -220,14 +223,7 @@ private async Task GenerateEntities(NetDaemonHost daemonHost, string sourceFolde

_entitiesGenerated = true;

var services = await daemonHost.GetAllServices().ConfigureAwait(false);
var sourceRx = CodeGenerator.GenerateCodeRx(
"NetDaemon.Generated.Reactive",
daemonHost.State.Select(n => n.EntityId).Distinct(),
services
);

await File.WriteAllTextAsync(Path.Combine(sourceFolder!, "_EntityExtensionsRx.cs.gen"), sourceRx).ConfigureAwait(false);
await _codeGenerationHandler.GenerateEntitiesAsync(daemonHost, sourceFolder).ConfigureAwait(false);
}

private static async Task<bool> WaitForDaemonToConnect(NetDaemonHost daemonHost, CancellationToken stoppingToken)
Expand All @@ -243,4 +239,4 @@ private static async Task<bool> WaitForDaemonToConnect(NetDaemonHost daemonHost,
return daemonHost.IsConnected;
}
}
}
}

0 comments on commit c6256f7

Please sign in to comment.