Files
Evergreen-Health/Evergreen.Health.Application/Health/Scenes/DeviceSceneContext.cs
T
2026-10-09 16:46:30 +08:00

35 lines
1.6 KiB
C#

using Evergreen.Health.Application.Health.Devices.Contracts;
using Evergreen.Health.Application.Health.Integrations.HomeAssistant;
namespace Evergreen.Health.Application.Health.Scenes;
public sealed class DeviceSceneContext
{
public IReadOnlyDictionary<string, HomeAssistantState> States { get; }
public List<HomeAssistantActionResult> Results { get; }
public DeviceActionRunner Runner { get; }
public DeviceSceneContext(DeviceActionRunner runner, IReadOnlyDictionary<string, HomeAssistantState> states,
List<HomeAssistantActionResult> results) => (Runner, States, Results) = (runner, states, results);
public Task RunAsync(DeviceCommand command, CancellationToken cancellationToken)
=> Runner.RunAsync(States, Results, command, cancellationToken);
public async Task ExternalAsync(string name, string entityId, Func<CancellationToken, Task> operation,
CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
var result = new HomeAssistantActionResult { Name = name, EntityId = entityId };
Results.Add(result);
try
{
await operation(cancellationToken);
result.Status = string.IsNullOrWhiteSpace(entityId) ? "Completed" : "Succeeded";
result.Message = string.IsNullOrWhiteSpace(entityId) ? "内部任务已处理" : "控制指令已发送";
}
catch (Exception exception) when (exception is not OperationCanceledException)
{
result.Status = "Failed"; result.Message = exception.Message;
}
}
}