using CShocker.Devices.Abstract; using CShocker.Devices.APIs; using CShocker.Ranges; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace CShocker.Devices.Additional; public class ApiJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(Api)); } public override object ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer) { JObject jo = JObject.Load(reader); DeviceApi? apiType = (DeviceApi?)jo.SelectToken("ApiType")?.Value(); switch (apiType) { case DeviceApi.OpenShockHttp: return new OpenShockHttp( jo.SelectToken("IntensityRange")!.ToObject()!, jo.SelectToken("DurationRange")!.ToObject()!, jo.SelectToken("ApiKey")!.Value()!, jo.SelectToken("Endpoint")!.Value()! ); case DeviceApi.OpenShockSerial: return new OpenShockSerial( jo.SelectToken("IntensityRange")!.ToObject()!, jo.SelectToken("DurationRange")!.ToObject()!, jo.SelectToken("SerialPortI")!.ToObject()!, jo.SelectToken("ApiKey")!.Value()!, jo.SelectToken("Endpoint")!.Value()! ); case DeviceApi.PiShockHttp: return new PiShockHttp( jo.SelectToken("IntensityRange")!.ToObject()!, jo.SelectToken("DurationRange")!.ToObject()!, jo.SelectToken("ApiKey")!.Value()!, jo.SelectToken("Username")!.Value()!, jo.SelectToken("Endpoint")!.Value()! ); case DeviceApi.PiShockSerial: throw new NotImplementedException(); default: throw new Exception(); } } public override bool CanWrite => false; /// /// Don't call this /// public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer) { throw new Exception("Dont call this"); } }