using System; using HAServer.Core; using HAServer.Interfaces.Core; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace HAServer.Serialisation { public class TriggerJsonConverter:JsonConverter { private readonly IMessageBus _messageBus; private readonly DeviceConfig _deviceConfig; private readonly ILogProvider _logProvider; public TriggerJsonConverter(IMessageBus messageBus, DeviceConfig deviceConfig, ILogProvider logProvider) { _messageBus = messageBus; _deviceConfig = deviceConfig; _logProvider = logProvider; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } public override bool CanWrite => false; public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var jsonObject = JObject.Load(reader); var name = jsonObject["Name"].Value(); var triggerType = jsonObject["TriggerType"].Value(); var enabled = jsonObject["Enabled"]?.Value() ?? true; var conditions = serializer.Deserialize(jsonObject["Conditions"].CreateReader()); var actions = jsonObject["Actions"] != null ? serializer.Deserialize(jsonObject["Actions"].CreateReader()) : new[] {GetLegacyAction(jsonObject)}; return new Trigger(_messageBus, name, (TriggerType)triggerType, actions, conditions, _logProvider) { Enabled = enabled }; } private TriggerAction GetLegacyAction(JObject jsonObject) { var actionTopic = jsonObject["DeviceTopic"].Value(); var actionMethod = jsonObject["DeviceMethod"].Value(); if (!_deviceConfig.Devices.ContainsKey(actionTopic)) return null; var device = _deviceConfig.Devices[actionTopic]; var method = device.GetType().GetMethod(actionMethod); var action = (Action)Delegate.CreateDelegate(typeof(Action), device, method); return new TriggerAction(TriggerActionType.Device, device.Topic, action); } } }